У меня есть активность и много виджетов, некоторые из них имеют анимацию, а из-за анимации некоторые виджеты перемещаются (переводятся) один над другим. Например, текстовое представление перемещается по некоторым кнопкам. , ,
Дело в том, что я хочу, чтобы кнопки всегда были спереди. И когда текстовое изображение перемещается, я хочу переместиться за кнопки.
Я не могу этого добиться. Я перепробовал все, что знаю, и "giveToFront ()" определенно не работает.
обратите внимание, я не хочу управлять z-порядком по порядку размещения элементов в макете, потому что я просто не могу :), макет сложный, и я не могу разместить все кнопки в начале макета
RelativeLayout
чтобы "вид сверху" появлялся последним в XML. См stackoverflow.com/a/31340762/1121497Ответы:
Вы можете вызвать callToFront () в представлении, которое хотите разместить на переднем плане.
Это пример:
источник
A / B / C
хотел и хотел вывести егоA
на переднийa.bringToFront()
план , поэтому после запуска я получил такой макетB / C / A
.LinearLayout
нельзя использовать сbringToFront
. В итоге я использовалRelativeLayout
. См. Мой комментарий к самому вопросу.ViewCompat.setTranslationZ(view, 1)
с другой стороны работает отлично.Я просматривал переполнение стека, чтобы найти хороший ответ, и когда мне не удалось его найти, я просмотрел документы.
На этот простой ответ, кажется, еще никто не наткнулся:
перевод по умолчанию z равен 0,0
источник
setZ()
? Если я правильно помню, в конце концов, положение Z вида - это его высота плюс его перенос Z.ViewCompat.setZ(view, yourValueInPixels);
view.setZ()
работает только с API 21 и выше.Еще более простое решение - отредактировать XML действия. использование
источник
bringToFront()
- правильный путь, но ЗАМЕТЬТЕ, что вы должны вызыватьbringToFront()
иinvalidate()
метод в представлении самого высокого уровня (под вашим корневым представлением), например:Иерархия вашего представления:
Итак, когда вы анимируете свои кнопки (1-> 6), ваши кнопки будут под (ниже)
ImageView
. Чтобы перенести это (см. Выше),ImageView
вы должны вызватьbringToFront()
иinvalidate()
метод на своемLinearLayout
s. Тогда это будет работать :) ** ПРИМЕЧАНИЕ: Не забудьте установитьandroid:clipChildren="false"
для корневого макета или анимированного представления gradparent_layout. Давайте посмотрим на мой реальный код:.xml
Некоторый код в .java
Глюк!
источник
ConstraintLayout
который содержит aRelativeLayout
, а другойRelativeLayout
- того же размера, что и его rootConstraintLayout
(match_parent
). ПервыйRelativeLayout
имеет aButton
, а также находится позади (в z-порядке) второгоRelativeLayout
. Могу ли я сделать так, чтобы элементButton
в первомRelativeLayout
отображался поверх всего, чтобы он был видимым и интерактивным, используяView::bringToFront()
?С этим кодом в xml
источник
90dp
взялось?Попробуйте
FrameLayout
, это дает вам возможность размещать просмотры один над другим. Вы можете создать дваLinearLayouts
: один с фоновыми представлениями и один с представлениями переднего плана, и объединить их с помощьюFrameLayout
. Надеюсь это поможет.источник
Если вы используете
ConstraintLayout
, просто поместите элемент после других элементов, чтобы он был впереди остальных.источник
Вы можете попробовать использовать
bringChildToFront
, вы можете проверить, полезна ли эта документация на странице для разработчиков Android .источник
Может быть другой способ, который спасет положение. Просто создайте новый диалог с желаемым макетом и просто покажите его. Мне он нужен для отображения loadView поверх DialogFragment, и это был единственный способ добиться успеха.
В некоторых случаях, например в моем, принестиТоФронт () может не работать. Но содержимое макета dialog_top должно переопределять что-либо на уровне пользовательского интерфейса. Но в любом случае это уродливый обходной путь.
источник
я столкнулся с той же проблемой. следующее решение сработало для меня.
2-е решение - использовать xml, добавив этот атрибут в представление xml
источник
Вы можете использовать BindingAdapter следующим образом:
источник
Вам нужно использовать framelayout. И лучший способ сделать это - сделать вид невидимым, когда в этом нет необходимости. Также вам необходимо установить позицию для каждого вида, чтобы они двигались в соответствии с соответствующей позицией.
источник
Если вы используете,
LinearLayout
вы должны вызвать,myView.bringToFront()
а после вы должны позвонитьparentView.requestLayout()
иparentView.invalidate()
заставить родительский элемент перерисовать с новым дочерним порядком.источник
Благодаря пользователю Stack за это объяснение, у меня это работает даже на Android 4.1.1.
В моем динамическом использовании, например, я сделал
И БАММ!
источник
Попробуйте использовать на нем высоту, например
yourview.setElevation(5);
источник
Расставьте их в том порядке, в котором хотите показывать. Предположим, вы хотите показать представление 1 поверх представления 2. Затем напишите код представления 2, затем напишите код представления 1. Если вы не можете выполнить это упорядочение, вызовите функцию takeToFront () для корневого представления макета, который вы хотите вывести на передний план.
источник
Вы можете установить значение false для других представлений.
или
и установить
источник