Как донести взгляд до всего? - PullRequest
106 голосов
/ 20 июля 2011

У меня есть активность и много виджетов, некоторые из них имеют анимацию, и из-за анимации некоторые виджеты перемещаются (переводятся) друг на друга. Например, текстовое представление перемещается по некоторым кнопкам. , .

Теперь я хочу, чтобы кнопки всегда были спереди. И когда текстовое представление движется, я хочу двигаться за кнопками.

Я не могу добиться этого, я перепробовал все, что знаю, и «takeToFront ()» определенно не работает.

примечание: я не хочу управлять z-порядком по порядку размещения элемента в макете, потому что я просто не могу :), макет сложный, и я не могу разместить все кнопки в начале макета

Ответы [ 14 ]

121 голосов
/ 18 апреля 2014

Вы можете вызвать метод takeToFront () для представления, которое вы хотите получить впереди

Это пример:

    yourView.bringToFront();
32 голосов
/ 21 декабря 2015

Я искал переполнение стека, чтобы найти хороший ответ, и когда я не смог найти его, я просмотрел документы.

, кажется, никто еще не наткнулся на этот простой ответ:

ViewCompat.setTranslationZ(view, translationZ);

перевод по умолчанию z равен 0,0

19 голосов
/ 15 мая 2014

bringToFront() - правильный путь, но, ОБРАТИТЕ ВНИМАНИЕ, что вы должны вызывать методы bringToFront() и invalidate() в представлении самого высокого уровня (под вашим корневым представлением), например ::

Иерархия вашего представления:

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

Итак, когда вы анимируете назад свои кнопки (1-> 6), ваши кнопки будут находиться под (ниже) ImageView. Чтобы перенести его (выше) на ImageView, вы должны вызвать bringToFront() и invalidate() метод на ваших LinearLayout s. Тогда это будет работать :) ** ПРИМЕЧАНИЕ. Не забудьте установить android:clipChildren="false" для своего корневого макета или для animate-view gradparent_layout. Давайте посмотрим на мой реальный код:

.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>

Некоторый код в .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);

Глюк!

17 голосов
/ 27 июня 2017

Еще более простым решением является редактирование XML-кода активности. Используйте

android:translationZ=""
14 голосов
/ 20 июля 2011

Попробуйте FrameLayout, это дает вам возможность размещать представления друг над другом. Вы можете создать два LinearLayouts: один с фоновыми видами, а другой с передним видом и объединить их, используя FrameLayout. Надеюсь, это поможет.

4 голосов
/ 20 мая 2019

С этим кодом в XML

 android:translationZ="90dp"
2 голосов
/ 21 ноября 2017

Вы можете попробовать использовать bringChildToFront, вы можете проверить, полезна ли эта документация на странице для разработчиков Android .

2 голосов
/ 24 июля 2017

Я столкнулся с той же проблемой.Следующее решение сработало для меня.

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

2-е решение - с помощью xml добавление этого атрибута в представление xml

android:translationZ=""
2 голосов
/ 15 апреля 2016

Может быть другой способ, который спасет день. Просто запустите новый диалог с нужным макетом и просто покажите его. Мне это нужно для отображения loadView поверх DialogFragment, и это был единственный способ, которым я добился успеха.

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

метод takeToFront () может не работать в некоторых случаях, например у меня. Но содержимое макета dialog_top должно переопределять все на уровне пользовательского интерфейса. Но в любом случае, это уродливый обходной путь.

1 голос
/ 12 сентября 2018

Если вы используете ConstraintLayout, просто поместите элемент после других элементов, чтобы сделать его впереди, чем другие

...