studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android animation button textview z-order

android - programacion - ¿Cómo llevar la vista al frente de todo?



manual de programacion android pdf (11)

Tengo actividad y muchos widgets, algunos tienen animaciones y debido a las animaciones algunos de los widgets se están moviendo (traduciendo) uno sobre otro. Por ejemplo, la vista de texto se mueve sobre algunos botones. . .

Ahora el asunto es que quiero que los botones siempre estén en el frente. Y cuando la vista de texto se está moviendo, quiero moverme detrás de los botones.

No puedo lograr esto Probé todo lo que sé, y "bringToFront ()" Definely no funciona.

note que no quiero controlar el orden z por el orden de colocar el elemento en el diseño porque simplemente no puedo :), el diseño es complejo y no puedo colocar todos los botones al inicio del diseño


He estado buscando a través del desbordamiento de pila para encontrar una buena respuesta y cuando no pude encontrar una, revisé los documentos.

nadie parece haber tropezado con esta simple respuesta todavía:

ViewCompat.setTranslationZ(view, translationZ);

la traducción predeterminada z es 0.0


Necesitas usar framelayout. Y la mejor manera de hacerlo es hacer que la vista sea invisible cuando no se requiera. También necesita establecer la posición para cada vista, para que se muevan de acuerdo a su posición correspondiente


Pruebe FrameLayout , le da la posibilidad de poner vistas una encima de otra. Puede crear dos LinearLayouts : uno con las vistas de fondo y otro con vistas en primer plano, y combinarlos usando FrameLayout . Espero que esto ayude.


Puede establecer la visibilidad como falsa de otras vistas.

view1.setVisibility(View.GONE); view2.setVisibility(View.GONE); ...

o

view1.setVisibility(View.INVISIBLE); view2.setVisibility(View.INVISIBLE); ...

y establecer

viewN.setVisibility(View.VISIBLE);


Puede haber otra forma de salvar el día. Simplemente inicie un nuevo cuadro de diálogo con el diseño deseado y simplemente muéstrelo. Lo necesito para mostrar LoadView sobre un DialogFragment y esta fue la única forma en que tuve éxito.

Dialog topDialog = new Dialog(this, android.R.style.Theme_Translucent_NoTitleBar); topDialog.setContentView(R.layout.dialog_top); topDialog.show();

bringToFront () podría no funcionar en algunos casos como el mío. Pero el contenido del diseño dialog_top debe anular cualquier cosa en la capa ui. Pero de todos modos, esta es una solución fea.



Puede llamar a bringToFront () en la vista que desea obtener en el frente

Esto es un ejemplo:

yourView.bringToFront();


Si está utilizando LinearLayout , debe llamar a myView.bringToFront() y luego debe llamar a parentView.requestLayout() y parentView.invalidate() para forzar al padre a volver a dibujar con el nuevo orden secundario.


Una solución incluso más simple es editar el XML de la actividad. Utilizar

android:translationZ=""


me he enfrentado al mismo problema la siguiente solución me ha funcionado.

FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView); glFrame.addView(yourView); glFrame.bringToFront(); glFrame.invalidate();


bringToFront() es la manera correcta, pero, bringToFront() CUENTA que debes llamar a los bringToFront() e invalidate() en la vista de nivel más alto (debajo de tu vista raíz), por ejemplo:

La jerarquía de su vista es:

-RelativeLayout |--LinearLayout1 |------Button1 |------Button2 |------Button3 |--ImageView |--LinearLayout2 |------Button4 |------Button5 |------Button6

Entonces, cuando anime sus botones (1-> 6), sus botones estarán debajo (debajo) de ImageView . Para traerlo (arriba) a ImageView debe llamar a los bringToFront() e invalidate() en sus LinearLayout . Entonces funcionará :) ** NOTA: Recuerde configurar android:clipChildren="false" para su diseño raíz o gradparent_layout de la vista animada. Echemos un vistazo a mi código real:

.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:hw="http://schemas.android.com/apk/res-auto" android:id="@+id/layout_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/common_theme_color" android:orientation="vertical" > <com.binh.helloworld.customviews.HWActionBar android:id="@+id/action_bar" android:layout_width="match_parent" android:layout_height="@dimen/dimen_actionbar_height" android:layout_alignParentTop="true" hw:titleText="@string/app_name" > </com.binh.helloworld.customviews.HWActionBar> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/action_bar" android:clipChildren="false" > <LinearLayout android:id="@+id/layout_top" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> <ImageView android:id="@+id/imgv_main" android:layout_width="@dimen/common_imgv_height" android:layout_height="@dimen/common_imgv_height" android:layout_centerInParent="true" android:contentDescription="@string/app_name" android:src="@drawable/ic_launcher" /> <LinearLayout android:id="@+id/layout_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </RelativeLayout> </RelativeLayout>

Un poco de código en .java

private LinearLayout layoutTop, layoutBottom; ... layoutTop = (LinearLayout) rootView.findViewById(R.id.layout_top); layoutBottom = (LinearLayout) rootView.findViewById(R.id.layout_bottom); ... //when animate back //dragedView is my layoutTop''s child view (i added programmatically) (like buttons in above example) dragedView.setVisibility(View.GONE); layoutTop.bringToFront(); layoutTop.invalidate(); dragedView.startAnimation(animation); // TranslateAnimation dragedView.setVisibility(View.VISIBLE);

GLuck!