Definición del orden de vistas de Z de RelativeLayout en Android

Me gustaría definir el orden z de las vistas de RelativeLayout en Android.

Sé que una forma de hacerlo es llamar a bringToFront .

¿Hay una mejor manera de hacer esto? Sería genial si pudiera definir el orden z en el diseño xml.

La manera más fácil es simplemente prestar atención al orden en que se agregan las vistas a su archivo XML. Más abajo en el archivo significa más arriba en el eje Z.

Editar: Esto está documentado aquí y aquí en el sitio del desarrollador de Android. (Gracias @flightplanner)

Si quieres hacer esto en código, puedes hacer

 View.bringToFront(); 

ver documentos

Tenga en cuenta que los botones y otros elementos en API 21 y superior tienen una gran elevación y, por lo tanto, ignoran el orden xml de los elementos, independientemente del diseño principal. Me tomó un tiempo resolver eso.

Encontré los mismos problemas: en un diseño relativo parentView, tengo 2 hijos childView1 y childView2. Al principio, puse childView1 sobre childView2 y quiero que childView1 esté encima de childView2. Cambiar el orden de las vistas de los niños no me solucionó el problema. Lo que funcionó para mí es configurar android: clipChildren = “false” en parentView y en el código que establecí:

 childView1.bringToFront(); parentView.invalidate(); 

En Android a partir del API nivel 21, los elementos en el archivo de diseño obtienen su orden Z tanto de cómo se ordenan dentro del archivo, como se describe en la respuesta correcta, y de su elevación, un valor de elevación mayor significa que el artículo obtiene un orden Z más alto .

Esto a veces puede causar problemas, especialmente con botones que a menudo aparecen encima de los elementos que, de acuerdo con el orden del XML, deben estar debajo de ellos en orden Z. Para solucionarlo, simplemente configure android:elevation de los elementos en su diseño XML para que coincida con el orden Z que desea lograr.

Si configura una elevación de un elemento en el diseño, comenzará a proyectar una sombra. Si no quieres este efecto, puedes eliminar la sombra con un código como ese:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { myView.setOutlineProvider(null); } 

No he encontrado ninguna forma de eliminar la sombra de una vista elevada a través del diseño xml.

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

Pensé que agregaría una respuesta desde la introducción de la

android: traducciónZ

El campo XML cambió las cosas un poco. Las otras respuestas que sugieren correr

 childView1.bringToFront(); parentView.invalidate(); 

son totalmente acertadas, EXCEPTO por que este código NO traerá a childView1 en frente de ninguna vista con un android: translationZ en el archivo XML. Estaba teniendo problemas con esto, y una vez que eliminé este campo de las otras vistas, bringToFront () funcionó bien.

childView.bringToFront () no funcionó para mí, así que configuré la traducción Z del elemento agregado menos recientemente (el que estaba superponiendo a todos los otros elementos secundarios) a un valor negativo como el siguiente:

lastView.setTranslationZ(-10);

ver https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) para más

API 21 tiene build-in de view.setElevation(float)

Use ViewCompat.setElevation(view, float); para compatibilidad con versiones anteriores

Más métodos ViewCompat.setZ(v, pixels) y ViewCompat.setTranslationZ(v, pixels)

Otra forma de recolectar botones o ver una matriz y agregarla al final

Puede usar RelativeLayout personalizado con redefinido

protected int getChildDrawingOrder (int childCount, int i)

Tenga en cuenta que este método toma param i como “a qué punto debería dibujar i'th “. Así es como funciona ViewPager . Establece el orden de dibujo personalizado en PageTransformer con PageTransformer .

Compruebe si tiene alguna elevación en una de las Vistas en XML. Si es así, agregue elevación al otro elemento o elimine la elevación para solucionar el problema. A partir de ahí, es el orden de las vistas lo que determina lo que sucede por encima del otro.

Intereting Posts