Как отправить представление назад? Как управлять программным обеспечением z-заказа?

У меня есть проблема, чтобы отправить представление назад. В Android у нас есть метод, например, bringToFront() , чтобы разместить представление поверх другого представления. Таким образом, я хочу поместить представление ниже предыдущего изображения.

Есть ли какой-либо метод, например sendToBack() или bringToBack() в Android. Если да, может кто-нибудь мне помочь в этом.

Обратите внимание: я не хочу контролировать z-порядок по порядку размещения элементов в макете. Я хочу программно управлять z-ордером.

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

Afaik для этого нет встроенного решения. Наверное, вы пытаетесь изменить z-порядок в FrameLayout или что-то подобное.

Однако, я думаю, вы можете изменить порядок содержащихся дочерних элементов в макете. Методы RemoveChild … () и addView () могут принимать значения позиции, поэтому вы, скорее всего, могли бы менять дочерние элементы, и это изменило бы z-порядок. Тем не менее, это похоже на хакерское решение.

Или подумайте о том, чтобы изменить свойство видимости дочерних просмотров, вы можете получить подобное поведение, и это будет намного чище, я думаю.

Редактировать:

С новой версией Android, L Developer Preview, кажется, что, наконец, у нас есть возможность легко изменить Z-порядок просмотра. Свойства «Elevation» и «TranslationZ» для спасения: https://developer.android.com/preview/material/views-shadows.html

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

 public static void sendViewToBack(final View child) { final ViewGroup parent = (ViewGroup)child.getParent(); if (null != parent) { parent.removeView(child); parent.addView(child, 0); } } 

Метод sendToBack () отсутствует. Но если вы вызываете метод bringToFront () в нижнем позиционном представлении, вы получаете почти тот же эффект.

Вызовите bringToFront() в представлении, которое хотите получить спереди, а затем вызовите метод invalidate() во всем представлении, включая представление, которое вы хотите в начале. Повторите то же самое для всех слушателей.

Поэтому, когда прослушивается прослушиватель другого представления, предыдущее представление становится недействительным и будет в фоновом режиме.

Вот метод, который я использую, чтобы отправить представление в обратную сторону (так противоположно totoTront, вроде sendToBack):

  private void moveToBack(View myCurrentView) { ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent()); int index = myViewGroup.indexOfChild(myCurrentView); for(int i = 0; i<index; i++) { myViewGroup.bringChildToFront(myViewGroup.getChildAt(i)); } } 

Надеюсь это поможет!

Вы также можете попытаться использовать функциональность метода ViewGroup.addViewInLayout() который принимает индекс, определяющий, должно ли представление быть в конце или в начале списка

Вы можете попробовать сделать view.setVisibility(View.INVISIBLE) или view.setVisibility(View.GONE) .

ОБНОВИТЬ:

Это показывает, как выполнить то, что вы хотите сделать.

Я бы либо установил видимость на 0, либо просто подвел под него представление перед ним.

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