2011-09-21 6 views
10

Ho un'applicazione Android che può riprodurre audio/video e mostrare immagini. Per i video voglio sovrapporre un pulsante di riproduzione sopra l'immagine di anteprima e anche nelle viste elenco .. In questo momento, come sto facendo è con un ImageView in xml, e quindi il drawable è un livello di livello-elenco che Definisco programmaticamente perché una delle immagini è dinamica, ovviamente il pulsante play è statico. Voglio allineare il pulsante di riproduzione 10px dal basso e centrato orizzontalmente.Android - Il modo migliore per sovrapporre un pulsante di riproduzione su un'immagine/miniatura

mio ImageView è definita come questo (in XML)

<ImageView 
      android:id="@+id/EvidencePreview"  
      android:layout_width="267dp" 
      android:layout_height="201dp" 
      android:scaleType="centerCrop" 
      android:layout_margin="3dp" 
      android:layout_gravity="center_horizontal|center_vertical"/> 

L'ImageView è parte di un modulo in cui l'utente può modificare il titolo e altre informazioni. Poi nella mia attività ora creare l'elenco di layer in questo modo:

Resources resources = mContext.getResources(); 
Drawable playOverlayDrawable = resources.getDrawable(R.drawable.play_overlay_large);       
Drawable[] layers = new Drawable[2]; 
layers[0] = Drawable.createFromPath(tb.filePath); 
layers[1] = playOverlayDrawable; 
LayerDrawable layerDrawable = new LayerDrawable(layers); 
ViewGroup.LayoutParams lp = iv.getLayoutParams(); 

int imageHeight = lp.height; 
int imageWidth = lp.width; 
int overlayHeight = layers[1].getIntrinsicHeight(); 
int overlayWidth = layers[1].getIntrinsicWidth(); 
int lR = (imageWidth - overlayWidth)/2; 
int top = imageHeight - (overlayHeight + 10); 
int bottom = 10; 
layerDrawable.setLayerInset(1, lR, top, lR, bottom); 
iv.setImageDrawable(layerDrawable); 

Questo funziona solo quando l'orientamento dell'immagine è orizzontale. Ricorda che l'immagine/miniatura è il MINI_KIND che significa che dovrebbe essere 512 x 384 ma sto vedendo che in realtà non è la dimensione .. Sul mio telefono sono 480x800 o 800x480 a seconda dell'orientamento camera era in .. Dato che il mio layout larghezza/altezza è pre-definito voglio solo un modo per mantenere il livello del pulsante di riproduzione dal ridimensionamento del tutto e allinearlo allo stesso modo ogni volta ..

L'altro modo ovvio per fare questo sarebbe di usare un layout relativo (o forse un layout di frame?) ma speravo di evitarlo visto che sto usando lo stesso codice per visualizzare sia immagini che video (entrambi hanno un'anteprima in miniatura dell'immagine - ma solo video dovrebbe avere il pulsante play su di loro).

Qualche idea su come allineare i livelli con un elenco di livelli o alternative che funzionerebbero altrettanto bene o meglio?

risposta

18

ho finito per usare un FrameLayout come questo:

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="3dp" 
    android:layout_gravity="center_horizontal|center_vertical" > 

<ImageView 
    android:id="@+id/MediaPreview"  
    android:layout_width="267dp" 
    android:layout_height="201dp" 
    android:scaleType="centerCrop" 
    android:src="@drawable/loading" /> 

<ImageView 
    android:id="@+id/VideoPreviewPlayButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:paddingBottom="10dp" 
    android:layout_gravity="center_horizontal|bottom" 
    android:visibility="gone" 
    android:src="@drawable/play_overlay_large" /> 

</FrameLayout> 

Poi ho solo impostare la visibilità per View.VISIBLE al pulsante di riproduzione di anteprima per i video e lo ha lasciato andato per le foto. Per la mia visualizzazione elenco ho usato il metodo dell'elenco dei livelli mostrato sopra perché tutte le anteprime erano della stessa dimensione. Spero che questo aiuti qualcun altro!

avviso che il layout_gravity sul ImageView con id VideoPreviewPlayButton lo mette in basso in centro, orizzontalmente, e il padd 10dpBottom lo sposta un po 'dal basso.

+0

Ho fatto questo ma non ho potuto ottenere i clic per registrarmi più nella mia gridview – CQM

2

Considerare l'utilizzo di RelativeLayout come contenitore per le visualizzazioni. Ti dà la libertà di posizionare visualizzazioni figlio. Potresti associare il tuo pulsante al bordo destro o superiore della tua visualizzazione di immagini.

Problemi correlati