Я хотел бы определить порядок z представлений RelativeLayout в Android.
Я знаю, один из способов сделать это вызывает bringToFront
.
Есть ли лучший способ сделать это? Было бы здорово, если бы я мог определить порядок z в макете XML.
Я хотел бы определить порядок z представлений RelativeLayout в Android.
Я знаю, один из способов сделать это вызывает bringToFront
.
Есть ли лучший способ сделать это? Было бы здорово, если бы я мог определить порядок z в макете XML.
Ответы:
Самый простой способ - просто обратить внимание на порядок, в котором представления добавляются в ваш XML-файл. Вниз вниз в файле означает выше вверх по оси Z.
Изменить: это задокументировано здесь и здесь, на сайте разработчиков Android. (Спасибо @flightplanner)
источник
Если вы хотите сделать это в коде, вы можете сделать
см документы
источник
Обратите внимание, что кнопки и другие элементы в API 21 и выше имеют большую высоту и, следовательно, игнорируют порядок элементов xml независимо от родительского макета. Мне понадобилось время, чтобы понять это.
источник
В Android, начиная с уровня API 21, элементы в файле макета получают свой Z-порядок как от того, как они упорядочены в файле, как описано в правильном ответе, так и от их высоты, более высокое значение высоты означает, что элемент получает более высокий Z-порядок ,
Иногда это может вызвать проблемы, особенно с кнопками, которые часто появляются над элементами, которые в соответствии с порядком XML должны быть ниже их в Z-порядке. Чтобы это исправить, просто установите
android:elevation
элементы XML-макета в соответствии с желаемым Z-порядком.Если вы установите высоту элемента в макете, он начнет отбрасывать тень. Если вам не нужен этот эффект, вы можете удалить тень с помощью кода следующим образом:
Я не нашел способа убрать тень с возвышением через макет XML.
источник
android:elevation="1000dp"
. Никакая тень не отображается таким образом.Я столкнулся с теми же проблемами: в относительной компоновке parentView у меня есть 2 дочерних элемента childView1 и childView2. Сначала я помещаю childView1 выше childView2 и хочу, чтобы childView1 был поверх childView2. Изменение порядка просмотров детей не решило проблему для меня. Что мне помогло, так это установить android: clipChildren = "false" в parentView и в коде, который я установил:
источник
child.bringToFront()
сparent.invalidate()
работами, ноparent.bringChildToFront(child)
нет. Где логика, которую мы все ожидаем от ОС?android:clipChildren="false"
сделал свое дело. Спасибо!Обратите внимание, что вы можете использовать,
view.setZ(float)
начиная с уровня API 21. Здесь вы можете найти больше информации.источник
Думаю, я бы добавил ответ с момента введения
Поле XML немного изменило ситуацию. Другие ответы, которые предлагают запустить
полностью исключены, за исключением того, что этот код НЕ предоставит childView1 перед любым представлением с жестко запрограммированным android: translationZ в файле XML. У меня были проблемы с этим, и как только я удалил это поле из других представлений, метод takeToFront () работал просто отлично.
источник
elevation
API 21 имеет
view.setElevation(float)
встроеннуюиспользование
ViewCompat.setElevation(view, float);
для обратной совместимостиБольше методов
ViewCompat.setZ(v, pixels)
иViewCompat.setTranslationZ(v, pixels)
Другой способ собрать кнопки или просмотреть массив и использовать
addView
для добавления в RelativeLayoutисточник
childView.bringToFront () не работал для меня, поэтому я установил для Z перевода наименее недавно добавленного элемента (того, который перекрывал все остальные дочерние элементы) отрицательное значение, например, так:
lastView.setTranslationZ(-10);
см. https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) для получения дополнительной информации.
источник
Вы можете использовать обычай
RelativeLayout
с переопределеннымprotected int getChildDrawingOrder (int childCount, int i)
Имейте
i
в виду - этот метод принимает параметр как «какой вид я должен нарисоватьi'th
». Вот как этоViewPager
работает. Он устанавливает пользовательский порядок рисования в сочетании сPageTransformer
.источник
Проверьте, есть ли у вас повышение прав на одно из представлений в XML. Если так, добавьте высоту к другому элементу или удалите высоту, чтобы решить проблему. Отсюда порядок взглядов определяет, что превосходит другие.
источник
Или поместите перекрывающуюся кнопку или представления внутри FrameLayout. Затем RelativeLayout в xml-файле будет учитывать порядок дочерних макетов при их добавлении.
источник
Вы можете использовать приведенный ниже пример кода также для достижения того же
Это обратно совместимо. Вот
mCardView
вид, который должен быть нижеsourceView
.источник