2010-12-08 9 views
6

Aparentemente hay un bug en Android que rompe View.bringToFront.¿Cómo llevar una vista al frente sin llamar a bringToFront()?

Si tengo vistas dispuestas en un GridView y quiero traer una vista al frente al llamar a bringToFront(), es posible que se mueva a la posición inferior derecha en el GridView.

Algo sombrío está sucediendo allí, así que no puedo usar bringToFront(). Cuando no lo llamo, todo funciona bien. Pero las Vistas se superponen: si utilizo la animación de escala para escalar una Vista, se ve parcialmente oscurecida por las Vistas en la parte inferior y a la derecha.

He comprobado a cabo fuente de BringToFront y llama parent.bringChildToFront (...)

es este método

public void bringChildToFront(View child) { 
    int index = indexOfChild(child); 
     if (index >= 0) { 
      removeFromArray(index); 
      addInArray(child, mChildrenCount); 
      child.mParent = this; 
     } 
    } 

aparentemente quita la vista de sí mismo! ¡Sin piedad! ¿Es tan tonto un ViewGroup que no puede administrar índices Z de otra manera que los controles de mezcla? Obviamente, cuando GridView elimina a su hijo y luego lo vuelve a agregar, ¡se coloca al final de la Grilla!

¿Hay algo que pueda hacer para mostrar una Vista encima de otras sin recurrir a alguna piratería? Una cosa que me viene a la mente es crear otra Vista encima de GridView, que aparecerá por encima de la que trato de traer a Frente(), pero no me gusta esta solución.

Respuesta

3

aparentemente me perdí la propiedad android:clipChildren="false" en GridView. Soluciona mi problema

+0

Esto no funcionará con la animación de propiedades. –

1

¿Ha intentado hacer el View enfocable y acaba de llamar requestFocus()?

1

Llamar a bringToFront() cambia el orden en el GridView. Intenta crear un ImageView con una imagen de la vista que quieras animar y animar en su lugar.

Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
view.draw(canvas); 
final ImageView imageView = new ImageView(getActivity()); 
imageView.setImageBitmap(bitmap); 
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(view.getWidth() , view.getHeight()); 
imageView.setLayoutParams(params); 
rootview.addView(imageView); 

Agregue un oyente de animación a su animación y elimine el ImageView al final de la animación.

1

De API 21 puede llamar a:

view.setZ(float) 
0

Si se dirige a la API por encima de 21, sólo tiene que añadir el atributo android:translationZ="xxx dp" a su XML.

Tenga en cuenta que si agrega elevación en vistas como la vista de carta, se entra en el eje Z. Y si quieres que una vista salga en primer plano usando esta forma, solo tienes que hacerla más alta que la elevación que establezcas.

Ejemplo: 6 dp de elevación en cardview requerirá un 7dp en la traducción del atributoZ de la vista que desea en primer plano.

Cuestiones relacionadas