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)
fuente
Si quieres hacer esto en código puedes hacerlo
ver documentos
fuente
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.
fuente
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:
No he encontrado ninguna forma de eliminar la sombra de una vista elevada a través del diseño xml.
fuente
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é:
fuente
child.bringToFront()
conparent.invalidate()
obras, peroparent.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.fuente
Pensé que agregaría una respuesta desde la introducción de la
El campo XML cambió las cosas un poco. Las otras respuestas que sugieren correr
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.
fuente
elevation
API 21 tiene
view.setElevation(float)
incorporadoUsar
ViewCompat.setElevation(view, float);
para compatibilidad con versiones anterioresMá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 RelativeLayoutfuente
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
fuente
Puede usar personalizado
RelativeLayout
con redefinidoprotected int getChildDrawingOrder (int childCount, int i)
Tenga en cuenta que este método toma el parámetro
i
como "qué vista debo dibujari'th
". Así es comoViewPager
funciona. Establece un orden de dibujo personalizado en conjunción conPageTransformer
.fuente
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.
fuente
O coloque el botón o las vistas superpuestas dentro de un FrameLayout. Luego, RelativeLayout en el archivo xml respetará el orden de los diseños secundarios a medida que se agregan.
fuente
Puede usar el siguiente ejemplo de código también para lograr lo mismo
Esto es compatible con versiones anteriores. Aquí
mCardView
hay una vista que debería estar debajosourceView
.fuente