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 .
Dar una oportunidad para .bringToFront()
:
http://developer.android.com/reference/android/view/View.html#bringToFront%28%29
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.