traer superponer studio sobre poner otro otra linearlayout imagenes imagen frente encima elementos elemento amontonados android android-layout z-index

sobre - superponer imagenes android studio



Colocar/superponer(índice z) una vista sobre otra vista en Android (9)

Tengo un diseño lineal que consiste en vista de imagen y texto, uno debajo del 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 vista de texto pequeño de, por ejemplo, 50dip en longitud y anchura, colocada sobre la vista de imagen, por "sobre" Me refiero al índice z más que a la vista de imagen, quiero colocar esto, en el centro y encima (superpuesto) de la vista de imagen.

Quiero saber cómo podemos colocar una vista por encima de la otra, con un índice z variable (preferiblemente en diseño lineal).


Cambiando el orden de sorteo

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

Llamar a OrderLayout#setDrawOrder(int) con 0-1-2 resulta en:


AFAIK no puede hacerlo con diseños lineales, tendrá que ir a un RelativeLayout .



Hay una manera de usar LinearLayout. Simplemente establezca el margen superior de su elemento anterior en el valor negativo correspondiente y asegúrese de que el elemento que desea en la parte superior se encuentre 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>


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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_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á en la parte superior de ImageView, a lo largo del centro inferior de la imagen.


Prueba esto en un RelativeLayout:

ImageView image = new ImageView(this); image.SetZ(float z);

Esto funciona para mi.


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


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


Resolví el mismo problema agregando android:elevation="1dp" a la vista que desee sobre otra.