5

下面的代码是我尝试将 mMyView 发送到 mPivotParent 的一组子项的前面或后面,因此它将呈现在其他人的顶部或后面。在我的情况下,隐藏视图是不够的。

mPivotParent 是一个 FrameLayout。

查看mPivotParent.mChildren显示我下面的代码“有效”,因为顺序设置正确。然而它对 z 顺序没有影响。不仅如此,调用重新定位代码的次数越多,帧速率也会越来越慢。总共有 4 个孩子mPivotParent.mChildrenCount,如预期的那样始终保持在 4 个。

我的目标是 API Level 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();
}
4

2 回答 2

5

部分解决方案

这是一个效率低下的技巧,但它适用于我的目的,即取出顶部的项目并将其发送到后面,使所有其他项目保持相同的顺序。

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

注意:这在任意重新排序的一般情况下不起作用。

于 2014-01-09T22:54:55.460 回答
1

试试这个。

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。

于 2015-12-19T14:54:32.330 回答