2012-03-22 31 views
5

Đoạn mã dưới đây là nỗ lực của tôi để gửi mMyView tới mặt trước hoặc mặt sau của tập con của mPivotParent để nó sẽ được hiển thị trên đầu hoặc sau những người khác. Ẩn chế độ xem sẽ không phải đủ trong trường hợp của tôi.Cách điều chỉnh thứ tự z theo dõi theo chương trình

mPivotParent là FrameLayout.

Nhìn vào mPivotParent.mChildren cho thấy mã của tôi bên dưới "hoạt động" ở chỗ thứ tự đang được đặt chính xác. Tuy nhiên, nó không có tác động đến thứ tự z. Không chỉ điều này, nhưng tốc độ khung hình được tích lũy chậm hơn và chậm hơn nhiều lần mã định vị lại được gọi. Có tổng cộng 4 trẻ em và mPivotParent.mChildrenCount vẫn ở mức 4 trong suốt như mong đợi.

Tôi đang nhắm mục tiêu API Cấp 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(); 
} 

Trả lời

5

phần Giải pháp

Dưới đây là một hack hơi kém hiệu quả nhưng nó hoạt động cho mục đích của tôi, mà là để lấy item trên và gửi nó ở phía sau, giữ tất cả các mục khác theo thứ tự của chúng.

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

Lưu ý: này không hoạt động trong trường hợp tổng quát của tùy ý tái đặt hàng.

1

Hãy thử điều này.

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

Mã này cung cấp sắp xếp lại tùy ý. Mảng số nguyên "thứ tự" được sử dụng để chỉ ra thứ tự mới của mỗi chế độ xem, trong đó thứ tự [n] = x có nghĩa là thứ tự mới của childAt (x) là n.

Các vấn đề liên quan