Me gustaría definir el orden z de las vistas de un RelativeLayout en Android.
Sé que una forma de hacer esto es llamar bringToFront
.
¿Hay alguna forma mejor de hacer esto? Sería genial si pudiera definir el orden z en el diseño xml.
Me gustaría definir el orden z de las vistas de un RelativeLayout en Android.
Sé que una forma de hacer esto es llamar bringToFront
.
¿Hay alguna forma mejor de hacer esto? Sería genial si pudiera definir el orden z en el diseño xml.
Respuestas:
La forma 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 para desarrolladores de Android. (Gracias @flightplanner)
Tenga en cuenta que los botones y otros elementos en API 21 y superiores tienen una elevación elevada y, por lo tanto, ignoran el orden xml de los elementos independientemente del diseño principal. Me tomó un tiempo entender eso.
En Android a partir del nivel 21 de API, 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, como de su elevación, un valor de elevación más alto significa que el elemento obtiene un orden Z más alto .
Esto a veces puede causar problemas, especialmente con botones que a menudo aparecen en la parte superior de los elementos que de acuerdo con el orden del XML deben estar debajo de ellos en el orden Z. Para solucionar esto, configure los android:elevation
elementos en su XML de diseño para que coincidan con el orden Z que desea lograr.
Si establece una elevación de un elemento en el diseño, comenzará a proyectar una sombra. Si no desea este efecto, puede eliminar la sombra con un código como este:
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.
android:elevation="1000dp"
. Ninguna sombra se representa de esta manera.
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 opiniones de los niños no resolvió el problema para mí. Lo que funcionó para mí es configurar android: clipChildren = "false" en parentView y en el código que configuré:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
con parent.invalidate()
obras, pero parent.bringChildToFront(child)
no. ¿Dónde está la lógica que todos esperamos de un sistema operativo?
android:clipChildren="false"
hizo el truco. ¡Gracias!
Tenga en cuenta que puede usar a view.setZ(float)
partir del nivel 21 de API. Aquí puede encontrar más información.
Pensé que agregaría una respuesta desde la introducción de la
android: translationZ
El campo XML cambió las cosas un poco. Las otras respuestas que sugieren correr
childView1.bringToFront();
parentView.invalidate();
están totalmente en EXCEPTO porque este código NO traerá childView1 delante de ninguna vista con un Android codificado: translationZ en el archivo XML. Estaba teniendo problemas con esto, y una vez que eliminé este campo de las otras vistas, bringToFront () funcionó bien.
elevation
API 21 tiene view.setElevation(float)
incorporado
Usar ViewCompat.setElevation(view, float);
para compatibilidad con versiones anteriores
Más métodos ViewCompat.setZ(v, pixels)
yViewCompat.setTranslationZ(v, pixels)
Otra forma de recopilar botones o ver la matriz y usar addView
para agregar a RelativeLayout
childView.bringToFront () no funcionó para mí, por lo que configuré la traducción Z del elemento agregado menos recientemente (el que estaba superponiendo a todos los demás elementos secundarios) a un valor negativo de la siguiente manera:
lastView.setTranslationZ(-10);
ver https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) para más
Puede usar personalizado RelativeLayout
con redefinido
protected int getChildDrawingOrder (int childCount, int i)
Tenga en cuenta que este método toma el parámetro i
como "qué vista debo dibujar i'th
". Así es como ViewPager
funciona. Establece un orden de dibujo personalizado en conjunción 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 resolver el problema. A partir de ahí, es el orden de las vistas lo que dicta lo que está por encima del otro.