studio - Definición de orden Z de vistas de RelativeLayout en Android
superponer elementos android studio (11)
Me gustaría definir el orden z de las vistas de un RelativeLayout en Android.
Sé que una forma de hacerlo es llamar a bringToFront
.
¿Hay alguna mejor manera de hacer esto? Sería genial si pudiera definir el orden z en el diseño xml.
API 21 tiene view.setElevation(float)
Utilice 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 coleccionar botones o ver la matriz y agregarlo al final
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 determina lo que está por encima de los demás.
En Android a partir del nivel 21 de la API, los elementos en el archivo de diseño obtienen su orden Z tanto por la forma en que se ordenan dentro del archivo, como se describe en la respuesta correcta, y por su elevación, un valor de elevación más alto significa que el elemento tiene un orden Z más alto .
Esto a veces puede causar problemas, especialmente con los botones que aparecen a menudo en la parte superior de los artículos que de acuerdo con el orden del XML debe estar por debajo de ellos con el fin de Z. Para solucionar este problema simplemente establecer el android:elevation
de los elementos en los que su diseño XML para que coincida con el orden Z que quiere 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 así:
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.
Encontré los mismos problemas: En un diseño relativo parentView, tengo 2 hijos childView1 y childView2. En un primer momento, pongo por encima de childView1 childView2 y quiero childView1 a estar en la cima de childView2. Cambiar el orden de las opiniones de los niños no me solucionó el problema. Lo que funcionó para mí es establecer androide: clipChildren = "false" en parentView y en el código puse:
childView1.bringToFront();
parentView.invalidate();
Pensé en añadir una respuesta desde la introducción del
Android: traducciónZ
El campo XML cambió las cosas un poco. Las otras respuestas que sugieren correr.
childView1.bringToFront();
parentView.invalidate();
están totalmente en EXCEPTO, ya que 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 me quita este campo de los otros puntos de vista, BringToFront () funcionaba bien.
Puede usar RelativeLayout
personalizado con redefinido
protected int getChildDrawingOrder (int childCount, int i)
Tenga en cuenta que este método toma param i
como "qué vista debería dibujar i''th
". Así es como funciona ViewPager
. Establece el orden de dibujo personalizado en PageTransformer
con PageTransformer
.
Tenga en cuenta que los botones y otros elementos en API 21 y superiores 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 para resolver eso.
Tenga en cuenta que puede utilizar view.setZ(float)
de partida desde el nivel de la API 21. here usted puede encontrar más información.
childView.bringToFront () no funcionó para mí, así que configuré la traducción Z del elemento que se agregó recientemente (el que estaba sobreponiendo a todos los demás niños) a un valor negativo como:
lastView.setTranslationZ(-10);
vea https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) para más información