Ответ 1
Вы можете вызвать метод bringToFront() в представлении, которое вы хотите получить спереди
Это пример:
yourView.bringToFront();
У меня есть активность и много виджетов, некоторые из них имеют анимацию, и из-за анимации некоторые из виджетов перемещаются (переводятся) друг над другом. Например, текстовое представление перемещается по некоторым кнопкам.,.
Теперь я хочу, чтобы кнопки всегда были на передней панели. И когда текстовое перемещение движется, я хочу двигаться за кнопками.
Я не могу этого добиться. Я пробовал все, что знаю, и "bringToFront()" definitelly "не работает.
note Я не хочу контролировать z-порядок по порядку размещения элемента в макете, потому что я просто не могу:), макет сложный, и я не могу поместить все кнопки при попрошайничестве макета
Вы можете вызвать метод bringToFront() в представлении, которое вы хотите получить спереди
Это пример:
yourView.bringToFront();
Я просматривал переполнение стека, чтобы найти хороший ответ, и когда я не смог найти его, я просмотрел документы.
Никто, кажется, не наткнулся на этот простой ответ:
ViewCompat.setTranslationZ(view, translationZ);
перевод по умолчанию z равен 0.0
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);
Глюк!
Еще более простым решением является редактирование XML-операции. Используйте
android:translationZ=""
Попробуйте FrameLayout
, это дает вам возможность размещать представления один над другим. Вы можете создать два LinearLayouts
: один с фоном и один с видом переднего плана и объединить их с помощью FrameLayout
. Надеюсь, это поможет.
С этим кодом в XML
android:translationZ="90dp"
Может быть другой способ, который экономит день. Просто запустите новый диалог с нужным макетом и просто покажите его. Мне нужно это для отображения 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. Но в любом случае это уродливое решение.
Я столкнулся с той же проблемой. следующее решение сработало для меня.
FrameLayout glFrame=(FrameLayout) findViewById(R.id.animatedView);
glFrame.addView(yourView);
glFrame.bringToFront();
glFrame.invalidate();
2-е решение - с помощью XML добавить этот атрибут в представление XML
android:translationZ=""
Вы можете попробовать использовать bringChildToFront
, вы можете проверить, полезна ли эта документация в Страница разработчиков Android.
Если вы используете ConstraintLayout
, просто поместите элемент после других элементов, чтобы сделать его впереди, чем другие
Вам нужно использовать framelayout. И лучший способ сделать это - сделать вид невидимым, если это не требуется. Также вам нужно установить положение для каждого вида, чтобы они перемещались в соответствии с соответствующей позицией
Если вы используете LinearLayout
, вы должны позвонить myView.bringToFront()
и после вызова parentView.requestLayout()
и parentView.invalidate()
, чтобы заставить родителя перерисовывать новый порядок потомков.
Расположите их в порядке, который вы хотите показать. Предположим, вы хотите показать вид 1 поверх вида 2. Затем напишите код вида 2, а затем код вида 1. Если вы не можете выполнить это упорядочивание, то вызовите метод receiveToFront() к корневому представлению макета, который вы хотите вывести вперед.
Вы можете установить видимость на false для других видов.
view1.setVisibility(View.GONE);
view2.setVisibility(View.GONE);
...
или
view1.setVisibility(View.INVISIBLE);
view2.setVisibility(View.INVISIBLE);
...
и установите
viewN.setVisibility(View.VISIBLE);