Я хотел бы определить порядок 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-порядком.
Если вы установите высоту элемента в макете, он начнет отбрасывать тень. Если вам не нужен этот эффект, вы можете удалить тень с помощью кода следующим образом:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Я не нашел способа убрать тень с возвышением через макет XML.
android:elevation="1000dp"
. Никакая тень не отображается таким образом.
Я столкнулся с теми же проблемами: в относительной компоновке parentView у меня есть 2 дочерних элемента childView1 и childView2. Сначала я помещаю childView1 выше childView2 и хочу, чтобы childView1 был поверх childView2. Изменение порядка просмотров детей не решило проблему для меня. Что мне помогло, так это установить android: clipChildren = "false" в parentView и в коде, который я установил:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
с parent.invalidate()
работами, но parent.bringChildToFront(child)
нет. Где логика, которую мы все ожидаем от ОС?
android:clipChildren="false"
сделал свое дело. Спасибо!
Обратите внимание, что вы можете использовать, view.setZ(float)
начиная с уровня API 21. Здесь вы можете найти больше информации.
Думаю, я бы добавил ответ с момента введения
андроид: translationZ
Поле XML немного изменило ситуацию. Другие ответы, которые предлагают запустить
childView1.bringToFront();
parentView.invalidate();
полностью исключены, за исключением того, что этот код НЕ предоставит 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. Если так, добавьте высоту к другому элементу или удалите высоту, чтобы решить проблему. Отсюда порядок взглядов определяет, что превосходит другие.