Как программно настроить z порядок просмотров - PullRequest
5 голосов
/ 22 марта 2012

Приведенный ниже код является моей попыткой отправить mMyView в начало или конец набора дочерних элементов mPivotParent, чтобы оно отображалось сверху или позади остальных.В моем случае достаточно скрыть представление , а не * 1002.

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();
}

Ответы [ 2 ]

5 голосов
/ 10 января 2014

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

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

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

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

1 голос
/ 19 декабря 2015

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

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();
}

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

...