2015-03-15 16 views
18

Tôi có một số trang trí mục cơ bản để vẽ một số nội dung theo phương thức ItemDecoration.onDrawOver.Làm thế nào để vô hiệu hóa bản vẽ trang trí mục RecyclerView trong thời gian hoạt ảnh mục

Điều này RecyclerView cũng có DefaultItemAnimator đặt trên đó. Hoạt ảnh đang hoạt động, tất cả đều tuyệt vời. Ngoại trừ một điều.

Khi tất cả các mục hiện có được hoán đổi với một mục mới được đặt trong bộ điều hợp này, các đồ trang trí sẽ được hiển thị trong khi hoạt ảnh đang chạy.

Tôi cần một cách để ẩn chúng. Khi hoạt ảnh kết thúc, chúng cần được hiển thị, nhưng trong khi nó đang chạy, chúng phải được ẩn.

tôi thử như sau:

public void onDrawOver(..., RecyclerView.State state) { 
    if(state.willRunPredictiveAnimations() || state.willRunSimpleAnimations()) { 
     return; 
    } 
    // else do drawing stuff here 
} 

nhưng điều này không giúp. Trang trí chỉ bị xóa trong khoảng thời gian ngắn hoạt ảnh, nhưng sau đó xuất hiện lại trong khi vẫn đang chạy.

Thiết lập cũng bao gồm RecyclerView.Adapter trong đó hasStableIds() (trong trường hợp bit đó quan trọng).

Trả lời

24

Nó có thể phụ thuộc phần nào vào loại hoạt hình bạn sử dụng, nhưng ít nhất là đối với DefaultItemAnimator, bạn cần tính đến bản dịch X/Y đang được thực hiện trong khi hoạt ảnh. Bạn có thể nhận các giá trị này với child.getTranslationX()child.getTranslationY().

Ví dụ, đối với trường hợp dọc của onDraw/onDrawOver:

private void drawVertical(Canvas c, RecyclerView parent) { 
    final int left = parent.getPaddingLeft(); 
    final int right = parent.getWidth() - parent.getPaddingRight(); 
    final int childCount = parent.getChildCount(); 
    final int dividerHeight = mDivider.getIntrinsicHeight(); 

    for (int i = 1; i < childCount; i++) { 
     final View child = parent.getChildAt(i); 
     final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 
     final int ty = (int)(child.getTranslationY() + 0.5f); 
     final int top = child.getTop() - params.topMargin + ty; 
     final int bottom = top + dividerHeight; 
     mDivider.setBounds(left, top, right, bottom); 
     mDivider.draw(c); 
    } 
} 

(Bạn có thể thích sử dụng ViewCompat.getTranslationY(child) nếu bạn cần hỗ trợ < API 11.)

Lưu ý: đối với các loại hình ảnh động, điều chỉnh bổ sung có thể cần phải được thực hiện. (Ví dụ, dịch ngang cũng có thể cần phải được tính toán.)

7

Tìm thấy một câu trả lời bản thân mình:

Để ẩn trang trí mục trong một hình ảnh động mục một cách đơn giản có thể sử dụng việc kiểm tra này trong onDraw/onDrawOver:

public void onDrawOver(..., RecyclerView parent, ...) { 
    if(parent.getItemAnimator() != null && parent.getItemAnimator().isRunning()) { 
     return; 
    } 
    // else do drawing stuff here 
} 
+4

Sử dụng phương pháp này làm cho đồ trang trí biến mất trong giây lát và sau đó xuất hiện lại sau hoạt ảnh mà tôi thấy không đẹp bằng cách làm đồ trang trí. Tuy nhiên, 1 anyway vì 'getItemAnimator(). IsRunning()' là thông tin hữu ích. :) –

+0

@LorneLaliberte có, tôi thấy rằng tác dụng phụ không may quá. Nếu bạn tìm thấy một cách xung quanh, xin vui lòng chia sẻ ... – dimsuz

+0

Xem câu trả lời của tôi cho một cách tiếp cận mà giải quyết điều này bằng cách làm động các đồ trang trí cùng với các hình ảnh động mặc định. –

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