Android 如何以编程方式调整视图的z顺序

Android 如何以编程方式调整视图的z顺序,android,view,android-framelayout,Android,View,Android Framelayout,下面的代码是我尝试将mMyView发送到mPivotParent子对象集的前面或后面,以便将其呈现在其他子对象的上面或后面。在我的情况下,隐藏视图是不够的 mPivotParent是一种框架布局 查看mPivotParent.mChildren显示我下面的代码“有效”,因为顺序设置正确。但它对z顺序没有影响。不仅如此,调用重新定位代码的次数越多,帧速率也会越来越慢。总共有4个孩子,mPivotParent。mChildrenCount与预期一样始终保持在4 我的目标是API 7级 @Overri

下面的代码是我尝试将mMyView发送到mPivotParent子对象集的前面或后面,以便将其呈现在其他子对象的上面或后面。在我的情况下,隐藏视图是不够的

mPivotParent是一种框架布局

查看
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();
}
@覆盖
公共布尔onTouchEvent(运动事件){
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;
如果(xLerpFromCenter<-0.2f&&mPivotParent.getChildAt(0)!=mMyView)
{
mPivotParent.removeView(mMyView);
mPivotParent.addView(mMyView,0);
刷新一切();
}
else if(xLerpFromCenter>0.2f&&mPivotParent.getChildAt(0)=mMyView)
{
mPivotParent.removeView(mMyView);
mPivotParent.addView(mMyView,mPivotParent.getChildCount()-1);
刷新一切();
}
返回super.onTouchEvent(事件);
}
私人的一切
{
对于(int i=0;i
部分解决方案

这是一个有点低效的破解方法,但它对我来说是有效的,就是把最上面的项目发送到后面,让所有其他项目保持相同的顺序

private void putFrontAtBack()
{
    for(int i = 0; i < mPivotParent.getChildCount() - 1; ++i)
    {
        mPivotParent.getChildAt(0).bringToFront();
    }
    refreshEverything();
}
private void putFrontAtBack()
{
对于(int i=0;i
注意:这在任意重新排序的一般情况下不起作用。

试试这个

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