web-dev-qa-db-ja.com

アイテムアニメーションの期間中、RecyclerViewアイテム装飾描画を無効にする方法

ItemDecoration.onDrawOverメソッドでいくつかの要素を描画する基本的なアイテム装飾があります。

このRecyclerViewにもDefaultItemAnimatorが設定されています。アニメーションは機能しています、すべてが素晴らしいです。 1つを除いて。

既存のすべてのアイテムがこのアダプターに設定された新しいアイテムと交換されると、アニメーションの実行中に装飾が表示されます。

それらを隠す方法が必要です。アニメーションが終了したら表示する必要がありますが、実行中は非表示にする必要があります。

私は以下を試しました:

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

しかし、これは役に立ちません。デコレーションはアニメーションの短期間だけ削除されますが、実行中は再び表示されます。

セットアップにはRecyclerView.Adapterも含まれます(これはビットが重要な場合)

22
dimsuz

使用しているアニメーションの種類によって多少異なりますが、少なくともDefaultItemAnimatorの場合、アニメーション中に行われるX/Y変換を考慮する必要があります。これらの値はchild.getTranslationX()およびchild.getTranslationY()で取得できます。

たとえば、_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);
    }
}
_

(<API 11をサポートする必要がある場合は、ViewCompat.getTranslationY(child)を使用することをお勧めします。)

注:他の種類のアニメーションの場合、追加の調整が必要になる場合があります。 (たとえば、水平方向の移動も考慮する必要がある場合があります。)

26
Lorne Laliberte

自分で答えを見つけました:

アイテムのアニメーション中にアイテムの装飾を非表示にするには、onDraw/onDrawOverでこのチェックを使用するだけです。

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

子アルファをチェックしてみることができます(ケースのデフォルトのアニメーションのみ)。アルファ0の場合は何もしない

0
user1221256