Определение порядка Z представлений RelativeLayout в Android

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

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

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

11 ответов


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

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


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

View.bringToFront();

посмотреть docs


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


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

childView1.bringToFront();

parentView.invalidate();

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

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

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

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

Я не нашел способа удалить тень повышенного представления через xml-файл макета.


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


думал, что добавлю ответ с момента введения

android: translationZ

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

childView1.bringToFront();

parentView.invalidate();

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


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

lastView.setTranslationZ(-10);

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


API 21 имеет view.setElevation(float) build-in

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


вы можете использовать custom RelativeLayout с переформировать

protected int getChildDrawingOrder (int childCount, int i)

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


проверьте, есть ли у вас какая-либо высота на одном из представлений в XML. Если это так, добавьте высоту к другому элементу или удалите высоту, чтобы решить проблему. Оттуда порядок взглядов диктует, что стоит выше других.