下面的代码是我尝试将mMyView发送到mPivotParent的子代集的前面或后面,以便将其呈现在其他对象的顶部或后面。在我看来,隐藏 View 是不够的。

mPivotParent是一个FrameLayout。

查看mPivotParent.mChildren可以看到我的代码在“工作”下面,因为该命令已正确设置。但是,它对z阶没有影响。不仅如此,重新定位代码被调用的次数越多,帧速率就会越来越慢。共有4个 child ,而mPivotParent.mChildrenCount始终保持在4个 child 的位置。

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

最佳答案

部分解决方案

这是一个效率低下的hack,但它对我有用,它是将顶层商品发送回去,而其他所有商品则保持相同的顺序。

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

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

关于android - 如何以编程方式调整 View 的z顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9817526/

10-09 06:53