Определение порядка Z просмотров RelativeLayout в Android - PullRequest
213 голосов
/ 10 апреля 2010

Я хотел бы определить z-порядок представлений RelativeLayout в Android.

Я знаю, что один из способов сделать это - позвонить bringToFront.

Есть ли лучший способ сделать это? Было бы здорово, если бы я мог определить порядок z в макете xml.

Ответы [ 12 ]

297 голосов
/ 10 апреля 2010

Самый простой способ - просто обратить внимание на порядок, в котором представления добавляются в ваш XML-файл. Чем ниже значение в файле, тем выше значение по оси Z.

Edit: Это задокументировано здесь и здесь на сайте разработчиков Android. (Спасибо @flightplanner)

85 голосов
/ 13 февраля 2013

Если вы хотите сделать это в коде Вы можете сделать

View.bringToFront();

см. документы

58 голосов
/ 19 сентября 2016

Обратите внимание, что кнопки и другие элементы в API 21 и выше имеют большую высоту, и поэтому игнорируют порядок элементов xml независимо от родительского макета. Мне понадобилось время, чтобы понять это.

17 голосов
/ 23 июля 2016

В Android, начиная с уровня API 21, элементы в файле макета получают свой Z-порядок как из того, как они упорядочены в файле, как описано в правильном ответе, так и из их высоты, более высокое значение высоты означает, что элемент получает более высокий Z порядок.

Это может иногда вызывать проблемы, особенно с кнопками, которые часто появляются сверху элементов, которые в соответствии с порядком XML должны быть ниже их в Z-порядке. Чтобы это исправить, просто установите android:elevation элементов в XML-макете, чтобы они соответствовали Z-порядку, которого вы хотите достичь.

Если вы установите высоту элемента в макете, он начнет отбрасывать тень. Если вы не хотите этот эффект, вы можете удалить тень с кодом, например, так:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
   myView.setOutlineProvider(null);
}

Я не нашел способа удалить тень с возвышением с помощью макета XML.

14 голосов
/ 01 октября 2014

Я столкнулся с теми же проблемами: в относительной компоновке parentView у меня есть 2 дочерних элемента childView1 и childView2. Сначала я помещаю childView1 выше childView2 и хочу, чтобы childView1 был поверх childView2. Изменение порядка просмотров детей не решило проблему для меня. Для меня сработало установить android: clipChildren = "false" в parentView и в коде, который я установил:

childView1.bringToFront();

parentView.invalidate();
13 голосов
/ 17 апреля 2015

Обратите внимание, что вы можете использовать view.setZ(float), начиная с уровня API 21. Здесь вы можете найти больше информации.

11 голосов
/ 20 августа 2015

Думал бы добавить ответ с момента введения

андроид: translationZ

Поле XML немного изменило ситуацию. Другие ответы, которые предлагают запустить

childView1.bringToFront();

parentView.invalidate();

полностью соответствует EXCEPT, так как этот код НЕ будет показывать childView1 перед любым представлением с жестко запрограммированным android: translationZ в файле XML. У меня были проблемы с этим, и как только я удалил это поле из других представлений, метод takeToFront () работал просто отлично.

5 голосов
/ 02 октября 2017

API 21 имеет view.setElevation(float) встроенный

Используйте ViewCompat.setElevation(view, float); для обратной совместимости

Дополнительные методы ViewCompat.setZ(v, pixels) и ViewCompat.setTranslationZ(v, pixels)

Другой способ собрать кнопки или просмотреть массив и использовать addView для добавления в RelativeLayout

3 голосов
/ 17 июня 2016

childView.bringToFront () не работал для меня, поэтому я установил для Z перевода наименее недавно добавленного элемента (который перекрывал все остальные дочерние элементы) отрицательное значение, например:

lastView.setTranslationZ(-10);

см. https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) для более

1 голос
/ 05 марта 2016

Вы можете использовать пользовательские RelativeLayout с переопределенными

protected int getChildDrawingOrder (int childCount, int i)

Имейте в виду - этот метод принимает параметр i как "какой вид я должен нарисовать i'th". Вот как работает ViewPager. Он устанавливает пользовательский порядок рисования в сочетании с PageTransformer.

...