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

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

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

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

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

Solutions Collecting From Web of "Как вывести взгляд на все?"

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

Это пример:

  yourView.bringToFront(); 

bringToFront() – это правильный путь, но, обратите bringToFront() , что вы должны вызвать bringToFront() и invalidate() на самом высоком уровне (под вашим корневым представлением), например:

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

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

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

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

Глюк!

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

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

 ViewCompat.setTranslationZ(view, translationZ); 

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

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

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

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

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

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

Еще более простое решение – отредактировать XML активности. использование

 android:translationZ="" 

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

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

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

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

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

или

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

И установить

 viewN.setVisibility(View.VISIBLE);