Pregunta

Me gustaría definir el orden z de las vistas de una relativeLayout en Android.

Sé que una forma de hacer esto es llamar bringToFront.

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

¿Fue útil?

Solución

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 de desarrollador de Android. (Gracias @flightplanner)

Otros consejos

Si quieres hacer esto en el código que puedes hacer

View.bringToFront();

ver documentos

Tenga en cuenta que los botones y otros elementos en API 21 y mayor tienen una alta elevación y, por lo tanto, ignoran el orden XML de elementos independientemente del diseño de los padres. Me tomó un tiempo resolverlo.

En Android a partir del nivel API 21, los elementos en el archivo de diseño obtienen su pedido 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 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, según el orden del XML, deben estar debajo de ellos en el orden z. Para arreglar esto, solo establezca el android:elevation de los elementos de su diseño XML para que coincida con el orden z que desea lograr.

Yo establece una elevación de un elemento en el diseño, comenzará a lanzar una sombra. Si no desea este efecto, puede eliminar la sombra con 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 XML de diseño.

Encontré los mismos problemas: en un diseño relativo de ParentView, tengo 2 hijos ChildView1 y ChildView2. Al principio, puse ChildView1 arriba de ChildView2 y quiero que ChildView1 esté en la cima de ChildView2. Cambiar el orden de las opiniones de los niños no resolvió el problema para mí. Lo que funcionó para mí es establecer Android: ClipChildren = "Falso" en ParentView y en el código que establecí:

childView1.bringToFront();

parentView.invalidate();

Tenga en cuenta que puede usar view.setZ(float) A partir del nivel API 21. Aquí Puedes encontrar más información.

Pensé en agregar una respuesta desde la introducción del

Android: traducción

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

childView1.bringToFront();

parentView.invalidate();

son totalmente acertados, excepto 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 que eliminé este campo de las otras vistas, traertofront () funcionó bien.

API 21 tiene view.setElevation(float) incorporación

Usar ViewCompat.setElevation(view, float); Para la compatibilidad con atrasado

Más métodos ViewCompat.setZ(v, pixels) y ViewCompat.setTranslationZ(v, pixels)

Otra forma de recoger botones o ver matriz y usar addView Para agregar a RelativeLayout

ChildView.BringTofront () no funcionó para mí, así que establecí la traducción Z del elemento menos recientemente agregado (el que superaba a todos los demás niños) a un valor negativo como así:

lastView.setTranslationZ(-10);

ver https://developer.android.com/reference/android/view/view.html#settranslationz(float) para más

Puedes usar personalizado RelativeLayout con redefinido

protected int getChildDrawingOrder (int childCount, int i)

Sea consciente: este método toma param i como "¿Qué vista debo dibujar? i'th". Así es como ViewPager obras. Establece el 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 la elevación al otro elemento o retire la elevación para resolver el problema. A partir de ahí, es el orden de las opiniones lo que dicta lo que viene por encima del otro.

O coloque el botón superpuesto o las vistas dentro de un framelayout. Luego, el relativeLayout en el archivo XML respetará el orden de los diseños de niños como agregaron.

Puede usar la muestra de código a continuación también para lograr lo mismo

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

Esto es compatible con retroceso. Aquí mCardView es una vista que debe estar debajo sourceView.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top