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

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

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

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

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

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

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

 View.bringToFront(); 

См. Документы

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

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

 childView1.bringToFront(); parentView.invalidate(); 

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

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

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

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

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

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

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

андроид: translationZ

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

 childView1.bringToFront(); parentView.invalidate(); 

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

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 с PageTransformer .

Intereting Posts
Android – как передавать видео с телефона на сервер? SSLPeerUnverifiedException при создании SSL-соединения на Android Панель инструментов не скрывается при прокрутке Создание кругового и прозрачного графического XML-Android Записываемое и исполняемое местоположение на Android Сервер для потоковой передачи RTSP для Android Сделать строку кликабельной, подчеркнутую в TextView Android Studio – Java JVM Экранирующие угловые скобки в XML в Eclipse / Android Пользовательское завершение Postfix в Android Studio Android: Как проверить, существует ли входящий номер SMS в контактном телефоне в BroadcastReceiver, а номер блока не существует GetLayoutInflater против LayoutInflater.from Фон кнопки изменения изображения Android GridView не обновляет свои дочерние представления после того, как адаптер получает новые элементы Ошибка при использовании компилятора Jack – приложение / сборка / промежуточные / упакованные / debug / classes.zip '- недопустимая библиотека