2012-03-22 8 views
5

아래 코드는 mMyView를 mPivotParent의 자식 집합의 앞이나 뒤로 보내려는 시도이므로 다른 쪽 위에 또는 뒤에 렌더링됩니다. 보기를 숨기면 이 아니라 내 경우에는이 충분합니다.프로그래밍 방식으로 뷰의 z 순서를 조정하는 방법

mPivotParent는 FrameLayout입니다.

mPivotParent.mChildren에서 보는 것은 주문이 올바르게 설정되어 있다는 점에서 아래의 코드가 작동한다는 것을 보여줍니다. 그러나 그것은 z 순서에 영향을 미치지 않습니다. 뿐만 아니라 프레임 속도는 누적 적으로 느리고 속도가 느려지므로 재 위치 지정 코드가 호출되는 횟수가 늘어납니다. 총 4 명의 어린이가 있으며 예상대로 전체에 mPivotParent.mChildrenCount이 남아 있습니다.

나는 여기 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임을 의미합니다.

관련 문제