2011-09-21 12 views
10

Tengo una aplicación de Android que puede reproducir audio/video y mostrar imágenes. Para videos, quiero superponer un botón de reproducción en la parte superior de la imagen de vista previa y también en vistas de lista ... Ahora mismo, cómo lo hago es con un ImageView en xml, y luego el drawable es una capa Definí programáticamente porque una de las imágenes es dinámica, el botón de reproducción es estático, por supuesto. Quiero alinear el botón de reproducción 10px desde la parte inferior y centrado horizontalmente.Android - La mejor manera de superponer un botón de reproducción en una imagen/miniatura

Mi ImageView se define como esto (en 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"/> 

El ImageView es parte de una forma donde el usuario puede editar el título y otra información. Luego, en mi actividad ahora crear la lista de capas de esta manera:

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); 

Esto sólo funciona cuando la orientación de la imagen es horizontal. Tenga en cuenta que la imagen/miniatura es MINI_KIND, lo que significa que se supone que es 512 x 384, pero estoy viendo que en realidad no es del tamaño. En mi teléfono son 480x800 u 800x480 dependiendo de la orientación. la cámara estaba en .. Como mi ancho/alto de diseño está predefinido, solo quiero una forma de mantener la capa del botón de reproducción en absoluto y alinearla de la misma manera cada vez ...

La otra forma obvia de hacerlo sería utilizar un diseño relativo (¿o quizás un diseño de marco?) pero esperaba evitarlo ya que estoy usando el mismo código para mostrar imágenes y videos (ambos tienen una vista previa en miniatura de la imagen, pero solo videos) debe tener el botón de reproducción en ellos).

¿Alguna idea de cómo alinear las capas con una lista de capas, o alternativas que funcionarían igual de bien o mejor?

Respuesta

18

Terminé usando un FrameLayout así:

<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> 

Entonces me acaba de establecer la visibilidad a View.VISIBLE que el botón de reproducción de vista previa de los vídeos y la dejó ido para las fotos. Para mi vista de lista utilicé el método de lista de capas que se muestra arriba porque todas las miniaturas tenían la misma dimensión. ¡Espero que esto ayude a alguien más!

observe que el layout_gravity en el ImageView con id VideoPreviewPlayButton lo pone en la parte inferior centrado horizontalmente, y el paddBottom 10dp lo mueve un poco desde la parte inferior.

+0

Lo hice pero no pude obtener clics para registrarme más en mi gridview – CQM

2

Considere usar RelativeLayout como el contenedor para sus vistas. Le da la libertad de colocar vistas de niños. Puede vincular su botón al borde derecho o superior de su vista de imagen.

Cuestiones relacionadas