Colocación / superposición (z-index) una vista sobre otra vista en android

Tengo un diseño lineal que consiste en imageview y textview, uno debajo de otro en un diseño lineal.

<LinearLayout android:orientation="horizontal" ... > <ImageView android:id="@+id/thumbnail" android:layout_weight="0.8" android:layout_width="0dip" android:layout_height="fill_parent"> </ImageView> <TextView android:id="@+id/description" android:layout_weight="0.2" android:layout_width="0dip" android:layout_height="wrap_content"> </TextView> 

Algunas reglas pueden faltar, esto es para dar una idea, cómo se ve el diseño. Quiero otra pequeña vista de texto de decir 50dip en longitud y ancho, colocado sobre la vista de la imagen, por "over" me refería a z-index más que imageview, quiero colocar esto, en el centro y encima (superposición) de la vista de la imagen.

Quiero saber cómo podemos colocar una vista por encima de la otra, con diferentes z-índice (preferiblemente en la disposición lineal)?

No puede utilizar LinearLayout para esto, pero puede utilizar FrameLayout . En un FrameLayout , el índice z se define por el orden en el que se agregan los elementos, por ejemplo:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/my_drawable" android:scaleType="fitCenter" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:padding="5dp" android:text="My Label" /> </FrameLayout> 

En este caso, el TextView se dibujaría en la parte superior del ImageView, en el centro inferior de la imagen.

RelativeLayout funciona de la misma manera, gana la última imagen en el diseño relativo.

Cambiar la orden de dibujo

Una alternativa es cambiar el orden en que las vistas son dibujadas por el padre. Puede habilitar esta función desde ViewGroup llamando a setChildrenDrawingOrderEnabled (true) y reemplazando getChildDrawingOrder (int childCount, int i) .

Ejemplo:

 /** * Example Layout that changes draw order of a FrameLayout */ public class OrderLayout extends FrameLayout { private static final int[][] DRAW_ORDERS = new int[][]{ {0, 1, 2}, {2, 1, 0}, {1, 2, 0} }; private int currentOrder; public OrderLayout(Context context) { super(context); setChildrenDrawingOrderEnabled(true); } public void setDrawOrder(int order) { currentOrder = order; invalidate(); } @Override protected int getChildDrawingOrder(int childCount, int i) { return DRAW_ORDERS[currentOrder][i]; } } 

Salida:

Calling OrderLayout#setDrawOrder(int) con 0-1-2 resultados en:

Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Puede usar view.setZ(float) partir del nivel API 21. Aquí puede encontrar más información.

Hay una manera de utilizar LinearLayout. Simplemente establezca el marginTop de su elemento anterior al valor negativo correspondiente, y asegúrese de que el elemento que desea en la parte superior es después del elemento que desea a continuación en su XML.

 <linearLayout android:orientation="horizontal" ... > <ImageView android:id="@+id/thumbnail" android:layout_weight="0.8" android:layout_width="0dip" android:layout_height="fill_parent" > </ImageView> <TextView android:id="@+id/description" android:layout_marginTop="-20dip" android:layout_weight="0.2" android:layout_width="0dip" android:layout_height="wrap_content" > </TextView> 

AFAIK no se puede hacer con diseños lineales, tendrás que ir para un RelativeLayout .

  • AndEngine- Dibujo del niño del sprite detrás de su padre
  • Diferente posición z para los elementos ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.