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

Lesezeit: 6 Minuten

PlatzierenUberlappen Z Index einer Ansicht uber einer anderen Ansicht in Android
saß

Ich habe ein lineares Layout, das aus imageview und textview besteht, untereinander in einem linearen Layout.

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

Einige Regeln könnten fehlen, dies soll eine Vorstellung davon geben, wie das Layout aussieht. Ich möchte eine weitere kleine Textansicht von beispielsweise 50 Dips in Länge und Breite, die über der Bildansicht platziert wird. Mit “über” meinte ich den Z-Index mehr als die Bildansicht. Ich möchte diese in der Mitte und über (überlappend) der Bildansicht platzieren.

Ich möchte wissen, wie wir eine Ansicht über der anderen platzieren können, mit unterschiedlichem Z-Index (vorzugsweise in linearem Layout)?

PlatzierenUberlappen Z Index einer Ansicht uber einer anderen Ansicht in Android
Kevin Copock

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

<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="https://stackoverflow.com/questions/4182486/@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>

In diesem Fall würde die TextView über der ImageView gezeichnet, entlang der unteren Mitte des Bildes.

  • Ja, ich habe es mit dem Frame-Layout selbst gemacht, nachdem ich die Dokumentation durchgesehen hatte. Danke.

    – saß

    14. Januar 2011 um 6:00 Uhr

  • Gibt es einen Vorteil, FrameLayout anstelle von RelativeLayout dafür zu verwenden?

    – Benutzer

    12. Juni 2012 um 16:53 Uhr

  • FrameLayout bezieht sich nicht auf andere Ansichten in der Gruppe, sondern überlagert sie nur in Bezug auf die übergeordnete Ansicht. RelativeLayout dient eher der Positionierung relativ zu anderen Elementen.

    – Kevin Copock

    12. Juni 2012 um 17:22 Uhr

  • Hallo kcoppock, mein Handy (HDPI) respektiert die Z-Reihenfolge im Frame-Layout nicht, aber ich habe ein anderes (XHDPI) und respektiere diese Reihenfolge. Weißt du, warum das so ist? Vielen Dank im Voraus! 😀

    – Merlí Escarpenter Pérez

    17. Februar 2015 um 10:53 Uhr

  • Ab API 21 / KitKat können Sie jetzt setZ und translationZ verwenden; der FrameLayout-Hack wird (endlich!) nicht mehr benötigt. Dies sollte die bevorzugte Antwort für die moderne 5.0+-Entwicklung sein: stackoverflow.com/a/29703860/358578

    – pbarranis

    24. Februar 2016 um 17:32 Uhr

PlatzierenUberlappen Z Index einer Ansicht uber einer anderen Ansicht in Android
Diyismus

Probieren Sie es aus .bringToFront():

http://developer.android.com/reference/android/view/View.html#bringToFront%28%29

  • können wir dies auch in XML-Dateien verwenden?

    – Anzeigen

    13. Juni 2012 um 8:25 Uhr

  • Ich war auf der Suche nach so etwas, um meine Ansicht dazu zu bringen, itz zindex während der Übersetzungsanimation zu ändern.

    – DeltaCap019

    25. Oktober 2013 um 10:25 Uhr

  • Könnten Sie eine Lösung für die Übersetzungsanimation finden?

    – nAchmedow

    15. September 2014 um 13:06 Uhr

  • bringChildToFront() ändert nur den Index der View innerhalb seiner Eltern

    – Zar E. Ahmer

    26. November 2014 um 18:05 Uhr

  • Dies schraubt die gesamte Layoutreihenfolge durcheinander

    – Jemshit Iskenderov

    26. Mai 2017 um 15:05 Uhr

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

  • Wenn Sie keine Höhe verwenden, benötigen Sie auch den größten Wert.

    – Sami Kuhmonen

    17. Juni 2016 um 15:52 Uhr

  • Diese Frage wurde gestellt und beantwortet, bevor es Höhenunterschiede gab. Die Verwendung der Höhe behebt das Problem nicht, wenn Ihre App ein minSdk kleiner als Lollipop hat (auf Pre-Lollipop-Telefonen sieht das Layout falsch aus, wenn Sie sich nur auf die Höhe verlassen) – Sie müssen immer noch auf die Reihenfolge des Layouts achten. Sie haben jedoch Recht, wenn Sie die Höhe auf der unteren Komponente verwenden, müssen Sie auf jeden Fall mindestens die gleiche oder höhere Höhe auf der Oberseite haben.

    – jt-gilkeson

    23. September 2016 um 18:39 Uhr


1646319195 191 PlatzierenUberlappen Z Index einer Ansicht uber einer anderen Ansicht in Android
Tobrun

Ziehreihenfolge ändern

Eine Alternative besteht darin, die Reihenfolge zu ändern, in der die Ansichten vom übergeordneten Element gezeichnet werden. Sie können diese Funktion von ViewGroup aus aktivieren, indem Sie anrufen setChildrenDrawingOrderEnabled(true) und überschreiben getChildDrawingOrder(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:

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

Geben Sie hier die Bildbeschreibung ein
Geben Sie hier die Bildbeschreibung ein
Geben Sie hier die Bildbeschreibung ein

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

  • Dies sollte jetzt die bevorzugte Antwort für API 21 / KitKat / 5.0 oder höher sein. Der alte frameLayout-Hack wird glücklicherweise nicht mehr benötigt. Persönlich verstehe ich den Unterschied zwischen setZ und translationZ nicht, aber letzteres ist ein Attribut und hat für mich wunderbar funktioniert. Danke!

    – pbarranis

    24. Februar 2016 um 17:36 Uhr

  • Für die vorherigen APIs können Sie auch ViewCompat#setZ() verwenden.

    – Ali Yucel Agul

    4. Oktober 2016 um 12:14 Uhr

  • @AliYucelAkgul, wenn Sie sich die Dokumente ansehen Hierdu kannst sehen Compatibility: API < 21: No-op . Also ich denke das wird nicht funktionieren

    – Wadim Kotow

    4. Oktober 2016 um 14:39 Uhr

  • @VadimKotov, ich habe es in meiner App versucht und es funktioniert einfach.

    – Ali Yucel Agul

    4. Oktober 2016 um 14:41 Uhr

  • @AliYucelAkgul Nun, das ist seltsam. Vielleicht ein Fehler in der Dokumentation? Sind Sie 100 % sicher, dass es für API < 21 funktioniert? Ich habe eine Idee, dass es die Reihenfolge der Ansichten für die vorherigen APIs ändern kann, aber keine ausgefallenen Dinge wie Höhe usw.

    – Wadim Kotow

    4. Oktober 2016 um 14:45 Uhr

Ich habe das gleiche Problem gelöst, indem ich add android:elevation="1dp" zu welcher Ansicht Sie es über eine andere möchten. Aber es kann nicht unter 5,0 angezeigt werden, und es wird einen kleinen Schatten haben, wenn Sie es akzeptieren können, ist es in Ordnung.

Also, die richtigste Lösung ist @kcoppock, sagte.

  • Dies sollte jetzt die bevorzugte Antwort für API 21 / KitKat / 5.0 oder höher sein. Der alte frameLayout-Hack wird glücklicherweise nicht mehr benötigt. Persönlich verstehe ich den Unterschied zwischen setZ und translationZ nicht, aber letzteres ist ein Attribut und hat für mich wunderbar funktioniert. Danke!

    – pbarranis

    24. Februar 2016 um 17:36 Uhr

  • Für die vorherigen APIs können Sie auch ViewCompat#setZ() verwenden.

    – Ali Yucel Agul

    4. Oktober 2016 um 12:14 Uhr

  • @AliYucelAkgul, wenn Sie sich die Dokumente ansehen Hierdu kannst sehen Compatibility: API < 21: No-op . Also ich denke das wird nicht funktionieren

    – Wadim Kotow

    4. Oktober 2016 um 14:39 Uhr

  • @VadimKotov, ich habe es in meiner App versucht und es funktioniert einfach.

    – Ali Yucel Agul

    4. Oktober 2016 um 14:41 Uhr

  • @AliYucelAkgul Nun, das ist seltsam. Vielleicht ein Fehler in der Dokumentation? Sind Sie 100 % sicher, dass es für API < 21 funktioniert? Ich habe eine Idee, dass es die Reihenfolge der Ansichten für die vorherigen APIs ändern kann, aber keine ausgefallenen Dinge wie Höhe usw.

    – Wadim Kotow

    4. Oktober 2016 um 14:45 Uhr

1646319197 677 PlatzierenUberlappen Z Index einer Ansicht uber einer anderen Ansicht in Android
DevB2F

Versuchen Sie dies in einem RelativeLayout:

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

Für mich geht das.

  • Du solltest es etwas besser erklären. Wo würden Sie zum Beispiel diesen Code einfügen?

    – DevB2F

    9. November 2017 um 23:04 Uhr

  • Nun, ich habe es in die Methode OnCreate() gesteckt. Jedes hinzugefügte Bild hat einen bevorzugten Z-Index gegenüber den zuvor hinzugefügten. Ich meine, durch den Z-Index kann ich die Position des nächsten hinter dem vorherigen ändern.

    – Rizzo

    29. Dezember 2017 um 22:14 Uhr

924500cookie-checkPlatzieren/Überlappen (Z-Index) einer Ansicht über einer anderen Ansicht in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy