Как программно настроить z порядок просмотров

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

MPivotParent – это FrameLayout.

Глядя на mPivotParent.mChildren показывает, что мой код ниже «работает» в том, что упорядочение настроено правильно. Тем не менее это не влияет на порядок z. Не только это, но частота кадров становится кумулятивно медленнее и медленнее, чем больше времени вызывается код репозиционирования. Всего 4 ребенка, а mPivotParent.mChildrenCount остается на 4, как и ожидалось.

Я нацелен на уровень API 7.

 @Override public boolean onTouchEvent(MotionEvent event) { Display display = getWindowManager().getDefaultDisplay(); float x = event.getRawX(); float sWidth = (int)display.getWidth(); float xLerpFromCenter = ((x / sWidth) - .5f) * 2.f; // [-1, 1] mRotateAnimation.mfLerp = xLerpFromCenter; if(xLerpFromCenter < -0.2f && mPivotParent.getChildAt(0) != mMyView) { mPivotParent.removeView(mMyView); mPivotParent.addView(mMyView, 0); refreshEverything(); } else if(xLerpFromCenter > 0.2f && mPivotParent.getChildAt(0) == mMyView) { mPivotParent.removeView(mMyView); mPivotParent.addView(mMyView, mPivotParent.getChildCount() - 1); refreshEverything(); } return super.onTouchEvent(event); } private void refreshEverything() { for(int i = 0; i < mPivotParent.getChildCount(); ++i) { mPivotParent.getChildAt(i).invalidate(); mPivotParent.getChildAt(i).requestLayout(); } mPivotParent.invalidate(); mPivotParent.requestLayout(); } 

Частичное решение

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

 private void putFrontAtBack() { for(int i = 0; i < mPivotParent.getChildCount() - 1; ++i) { mPivotParent.getChildAt(0).bringToFront(); } refreshEverything(); } 

Примечание. Это не работает в общем случае произвольного переупорядочения.

Попробуй это.

 private void reorder(int[] order) { if(order == null || order.length != mPivotParent.getChildCount()) return; for(int i = order.length - 1; i >= 0; i--) { mPivotParent.getChildAt(order[i]).bringToFront(); } refreshEverything(); } 

Этот код обеспечивает произвольное переупорядочение. Целочисленный массив «порядок» используется для указания нового порядка каждого вида, где порядок [n] = x означает, что новый порядок childAt (x) равен n.