2012-03-22 10 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であることを意味します。

関連する問題