Definiendo el orden Z de vistas de RelativeLayout en Android

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

Sé que una manera de hacer esto es llamar a bringToFront .

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

9 Solutions collect form web for “Definiendo el orden Z de vistas de RelativeLayout en Android”

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

Editar: Esto se documenta aquí y aquí en el sitio de desarrolladores de Android. (Gracias @ flightplanner)

Si quieres hacer esto en código, puedes hacerlo

 View.bringToFront(); 

Ver documentos

Tenga en cuenta que los botones y otros elementos de la API 21 y superiores tienen una alta elevación y, por lo tanto, ignoran el orden xml de los elementos, independientemente de la disposición principal. Me tomó un tiempo para calcular que uno fuera.

Encontré los mismos problemas: En un parentView de la disposición relativa, tengo 2 niños childView1 y childView2. En primer lugar, poner childView1 sobre childView2 y quiero childView1 para estar en la parte superior de childView2. Cambiar el orden de las vistas de los niños no solucionó el problema para mí. Lo que funcionó para mí es configurar android: clipChildren = "false" en parentView y en el código que establezco:

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

Tenga en cuenta que puede utilizar view.setZ(float) desde el nivel API 21. Aquí puede encontrar más información.

En Android, a partir del nivel 21 de la API, los elementos del 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 desde su elevación, un valor de elevación más alto significa que el elemento obtiene una orden Z más alta .

Esto a veces puede causar problemas, especialmente con los botones que a menudo aparecen en la parte superior de los elementos que de acuerdo con el orden de la XML debe estar por debajo de ellos en orden Z. Para arreglar esto, simplemente establezca el android:elevation de los elementos en su XML de diseño para que coincida con el orden Z que desea lograr.

I usted fija una elevación de un elemento en la disposición que comenzará a echar una sombra. Si no desea este efecto, puede eliminar la sombra con un código así:

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

No he encontrado ninguna manera de quitar la sombra de una vista elevada a través del xml de la disposición.

Pensé en añadir una respuesta desde la introducción de la

Androide traducción

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

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

Son totalmente mancha EXCEPTO para que este código NO traiga childView1 delante de cualquier vista con un androide codificado: translationZ en el archivo XML. Estaba teniendo problemas con esto, y una vez que quité este campo de las otras vistas, bringToFront () funcionó muy bien.

ChildView.bringToFront () no funcionó para mí, así que establezco la traducción de Z del elemento recientemente añadido (el que estaba superponiendo a todos los demás niños) a un valor negativo como:

lastView.setTranslationZ(-10);

Consulte https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) para obtener más información.

Puede utilizar RelativeLayout personalizado con redefinido

protected int getChildDrawingOrder (int childCount, int i)

Tenga en cuenta – este método toma param i como "qué vista debo dibujar i'th ". Así funciona ViewPager . Establece el orden de dibujo personalizado en PageTransformer con PageTransformer .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.