2012-03-22 53 views
5

以下代码是我尝试将mMyView发送到mPivotParent的子集的前面或后面,以便将其呈现在其他顶部或后面。在我的情况下,隐藏视图而不是就足够了。如何以编程方式调整视图的z顺序

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

回答

5

部分解决

这里是一个有点低效技巧,但它适合我的目的,这是采取顶部的项目,并发送它的后面,保持所有其他项目的顺序。

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

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

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。

相关问题