¿Cómo poner la vista delante de todo?

7 minutos de lectura

¿Como poner la vista delante de todo
Lukap

Tengo actividad y muchos widgets, algunos de ellos tienen animaciones y, debido a las animaciones, algunos de los widgets se mueven (traducen) uno sobre otro. Por ejemplo, la vista de texto se mueve sobre algunos botones. . .

Ahora la cosa es que quiero que los botones estén siempre al frente. Y cuando la vista de texto se mueve, quiero moverme detrás de los botones.

No puedo lograr esto. Intenté todo lo que sé, y “bringToFront()” definitivamente no funciona.

tenga en cuenta que no quiero controlar el orden z por el orden de colocación del elemento en el diseño porque simplemente no puedo :), el diseño es complejo y no puedo colocar todos los botones al principio del diseño

  • usé un RelativeLayout con la vista “superior” que aparece en último lugar en el XML. Consulte stackoverflow.com/a/31340762/1121497

    – Ferrán Maylinch

    10 jul.


  • alguien puede decir el código correspondiente en xml de ‘bringToFront’

    – Shirish Herwade

    22 jun.

  • Intenta usar la elevación bottomView=elevation:1dp y topView=elevation:2dp en tu xml || ViewCompat.setElevation(Ver, int)

    – Tlacaelel Ramón Luis

    07 dic.

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

Esto es un ejemplo:

    yourView.bringToFront();

  • Resultado inesperado: lo usé en un diseño lineal vertical y la vista traída al frente apareció en la parte inferior… Por ejemplo, tuve A / B / C y quería traer A al frente, así que después de correr a.bringToFront() Terminé con un diseño como B / C / A.

    – Ferrán Maylinch

    10 jul.


  • así que encontré LinearLayout no se puede usar con bringToFront. Terminé usando un RelativeLayout. Ver mi comentario sobre la pregunta en sí.

    – Ferrán Maylinch

    10 jul.

  • alguien puede decir el código correspondiente en xml de ‘bringToFront’

    – Shirish Herwade

    22 jun.

  • Esto da como resultado el reposicionamiento del elemento que estoy moviendo al frente por cualquier motivo. ViewCompat.setTranslationZ(view, 1) funciona perfectamente por otro lado.

    – Bimde

    14 ago. 17 en 21:04


  • si utilicé en manifiesto android:theme=”@android:style/Theme.Light.NoTitleBar” en actividad que yourView.bringToFront(); funciona perfectamente, pero usé android:theme=”@android:style/Theme.AppCompat.Light.NoActionBar” yourView.bringToFront(); no funciona Cualquier pista sobre eso.

    – Raúl

    27 mar. 18 en 10:22

¿Como poner la vista delante de todo
Krsna

Con este código en xml

 android:translationZ="90dp"

  • donde fue 90dp ¿viene de?

    – Sudhir Singh Khanger

    15 jul. 19 en 10:28

  • es entrada manual. Puede probar con según sus requisitos. ya sea 45dp o 135dp o 180dp o 270dp

    – Krsna

    17 jul.

  • ¿No podrías simplemente usar 1dp?

    – Tyler Turnbull

    09 jun.

  • API requerida 21+

    –Muhammad Saqib

    11 ago. 2020 a las 17:29

  • El valor de translationZ (90 dp) se agrega al valor proporcionado para android: elevación. Por lo tanto, translationZ + Elevación decidirá el orden. La vista con la suma más alta estará en el frente. El siguiente más alto detrás de él y así sucesivamente.

    – Namitha Reval

    23 jul.

1641925694 853 ¿Como poner la vista delante de todo
astuto

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 haberse topado con esta simple respuesta todavía:

ViewCompat.setTranslationZ(view, translationZ);

traducción predeterminada z es 0.0

  • Esa es la posición del elemento en el eje Z en px, también conocida como elevación. setTranslationX movería la vista a lo largo del eje X (izquierda/derecha), setTranslationY a lo largo del eje Y (arriba/abajo). El eje Z es el tercer eje.

    – xdevs23

    22 mar. 16 a las 11:41

  • Qué pasa setZ()? Si mal no recuerdo, la posición Z de la vista es su elevación más su traslación Z, después de todo.

    – Gensoukyou1337

    27 jul.

  • @Gensoukyou1337, entonces ViewCompat.setZ(view, yourValueInPixels); view.setZ() funciona solo en API 21 y superior.

    – Johnny Cinco

    27 nov.


  • Se verificó el código Java 8 en Android Studio: solo verifica si SDK_INT> = 21, por lo que para <21 api no tiene efecto.

    – Vadim

    09 oct.

1641925694 675 ¿Como poner la vista delante de todo
Toby

Una solución aún más sencilla es editar el XML de la actividad. Usar

android:translationZ=""

¿Como poner la vista delante de todo
justin

bringToFront() es el camino correcto, pero, TENGA EN CUENTA que debe llamar bringToFront() y invalidate() método en la vista de nivel más alto (bajo su vista raíz), por ejemplo:

La jerarquía de su vista es:

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

Por lo tanto, cuando vuelva a animar sus botones (1-> 6), sus botones estarán debajo (debajo) del ImageView. Para llevarlo encima (encima) del ImageView debes llamar bringToFront() y invalidate() método en su LinearLayouts. Entonces funcionará 🙂 **NOTA: Recuerde configurar android:clipChildren="false" para su diseño raíz o gradparent_layout de animate-view. 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="https://stackoverflow.com/questions/6759279/@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>

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

¡Suerte!

  • ¿Qué sucede si solo desea colocar el botón 6 sobre la vista de imagen y no los otros botones?

    –Adam Katz

    03 mar. 17 a las 12:07

  • @AdamKatz: Creo que debes reorganizarlos en otro puño de nivel. Entonces, tráelo en tu camino.

    – Justin

    04 mar. 17 a las 04:09

  • gracias, estoy tratando de traer solo un elemento de una vista de reciclador encima de una vista, pero dejo los otros elementos debajo, ¡bastante atascados!

    –Adam Katz

    04 mar. 17 en 19:12

  • Usé lo mismo. Funciona bien con un solo problema que oculta la barra de herramientas.

    – usuario2980181

    18 mayo, 2018 a las 09:15

  • ¿Esto funciona con múltiples niveles? digamos que tengo un ConstraintLayout que contiene un RelativeLayout, y otro RelativeLayout, ambos son del mismo tamaño que su raíz ConstraintLayout (match_parent). La primera RelativeLayout tiene un Button, y también está detrás (en el orden z) del segundo RelativeLayout. ¿Puedo hacer el Button en el primero RelativeLayout para que aparezca como si estuviera encima de todo, de modo que sea visible y se pueda hacer clic en él, usando View::bringToFront()?

    – oaskamay

    13 jul.

1641925694 398 ¿Como poner la vista delante de todo
Egor

Tratar FrameLayout, te da la posibilidad de poner vistas una encima de otra. Puedes crear dos LinearLayouts: uno con vistas de fondo y otro con vistas de primer plano, y combínelos usando el FrameLayout. Espero que esto ayude.

  • ¿Qué sucede si solo desea colocar el botón 6 sobre la vista de imagen y no los otros botones?

    –Adam Katz

    03 mar. 17 a las 12:07

  • @AdamKatz: Creo que debes reorganizarlos en otro puño de nivel. Entonces, tráelo en tu camino.

    – Justin

    04 mar. 17 a las 04:09

  • gracias, estoy tratando de traer solo un elemento de una vista de reciclador encima de una vista, pero dejo los otros elementos debajo, ¡bastante atascados!

    –Adam Katz

    04 mar. 17 en 19:12

  • Usé lo mismo. Funciona bien con un solo problema que oculta la barra de herramientas.

    – usuario2980181

    18 mayo, 2018 a las 09:15

  • ¿Esto funciona con múltiples niveles? digamos que tengo un ConstraintLayout que contiene un RelativeLayout, y otro RelativeLayout, ambos son del mismo tamaño que su raíz ConstraintLayout (match_parent). La primera RelativeLayout tiene un Button, y también está detrás (en el orden z) del segundo RelativeLayout. ¿Puedo hacer el Button en el primero RelativeLayout para que aparezca como si estuviera encima de todo, de modo que sea visible y se pueda hacer clic en él, usando View::bringToFront()?

    – oaskamay

    13 jul.

1641925695 16 ¿Como poner la vista delante de todo
Fajar Ulin Nuha

Si estás usando ConstraintLayout, solo coloque el elemento después de los otros elementos para que quede al frente que los demás

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad