Как вывести взгляд на все?

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

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

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

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

Ответ 1

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

Это пример:

    yourView.bringToFront();

Ответ 2

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

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

ViewCompat.setTranslationZ(view, translationZ);

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

Ответ 3

bringToFront() - это правильный путь, но, ЗАМЕЧАНИЕ, что вы должны вызывать метод bringToFront() и invalidate() на самом высоком уровне (под корневым представлением), например:

Ваша иерархия просмотров:

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

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

Глюк!

Ответ 4

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

android:translationZ=""

Ответ 5

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

Ответ 6

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

 android:translationZ="90dp"

Ответ 7

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

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

bringToFront() может не работать в некоторых случаях, например, у меня. Но содержимое макета dialog_top должно переопределять что-либо на уровне ui. Но в любом случае это уродливое решение.

Ответ 8

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

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

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

android:translationZ=""

Ответ 10

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

Ответ 11

Вам нужно использовать framelayout. И лучший способ сделать это - сделать вид невидимым, если это не требуется. Также вам нужно установить положение для каждого вида, чтобы они перемещались в соответствии с соответствующей позицией

Ответ 12

Если вы используете LinearLayout, вы должны позвонить myView.bringToFront() и после вызова parentView.requestLayout() и parentView.invalidate(), чтобы заставить родителя перерисовывать новый порядок потомков.

Ответ 13

Расположите их в порядке, который вы хотите показать. Предположим, вы хотите показать вид 1 поверх вида 2. Затем напишите код вида 2, а затем код вида 1. Если вы не можете выполнить это упорядочивание, то вызовите метод receiveToFront() к корневому представлению макета, который вы хотите вывести вперед.

Ответ 14

Вы можете установить видимость на false для других видов.

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

или

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

и установите

viewN.setVisibility(View.VISIBLE);