Platzieren / Überlappen (Z-Index) eine Ansicht über einer anderen Ansicht in Android

Ich habe ein lineares Layout, das aus Bildansicht und Textansicht besteht, untereinander in einem linearen Layout.

     

Einige Regeln mögen fehlen, das soll eine Vorstellung davon geben, wie das Layout aussieht. Ich möchte eine andere kleine Textansicht von etwa 50dip in Länge und Breite, über der Bildansicht platziert, von “über” ich meinte z-index mehr als Bildansicht, ich möchte dies in der Mitte und über dem Bild (überlappend) platzieren.

Ich möchte wissen, wie wir einen Blick übereinander legen können, mit variablem Z-Index (vorzugsweise im linearen Layout)?

Sie können dafür kein LinearLayout verwenden, aber Sie können ein FrameLayout . In einem FrameLayout wird der Z-Index durch die Reihenfolge definiert, in der die Elemente hinzugefügt werden, zum Beispiel:

     

In diesem Fall wird der TextView über der ImageView entlang der unteren Mitte des Bildes gezeichnet.

RelativeLayout funktioniert genauso, das letzte Bild im relativen Layout gewinnt.

Ändern der Zeichenreihenfolge

Eine Alternative besteht darin, die Reihenfolge zu ändern, in der die Ansichten vom übergeordneten Element gezeichnet werden. Sie können diese function von ViewGroup aus aktivieren, indem Sie setChildrenDrawingOrderEnabled (true) aufrufen und getChildDrawingOrder überschreiben (int childCount, int i) .

Beispiel:

 /** * 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]; } } 

Ausgabe:

Aufruf von OrderLayout#setDrawOrder(int) mit 0-1-2 ergibt:

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Sie können view.setZ(float) ab API-Level 21 verwenden. Hier finden Sie weitere Informationen.

Es gibt eine Möglichkeit, LinearLayout zu verwenden. Setzen Sie einfach den marginTop Ihres vorherigen Elements auf den entsprechenden negativen Wert, und stellen Sie sicher, dass das oben gewünschte Element in Ihrem XML-Dokument hinter dem gewünschten Element steht.

      

AFAIK können Sie es nicht mit linearen Layouts tun, müssen Sie für eine RelativeLayout gehen .

Versuchen Sie dies in einem RelativeLayout:

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

Für mich geht das.

Ich habe das gleiche Problem durch Hinzufügen von android:elevation="1dp" um welche Ansicht Sie es über andere wollen.