superponer studio index elementos android android-relativelayout z-order

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();


La forma más sencilla 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.

Edición: Esto está documentado here y here en el sitio de desarrolladores de Android. (Gracias @flightplanner)


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 .


Si quieres hacer esto en código puedes hacerlo.

View.bringToFront();

ver docs


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.