25

スクロールするときに RecyclerView の要素をアニメーション化する方法はありますか?

DefaultItemAnimatorとを調べましRecyclerView.ItemAnimatorたが、アニメーションはデータセットが変更された場合にのみ呼び出されるようです。間違っている場合は修正してください。

RecyclerView.ItemAnimator.animateMove()はそれがいつ呼ばれるかについて少し混乱していますか?そのクラスにいくつかのブレークポイントを設定しましたが、どれもアプリを停止しません。

しかし、私の質問に戻って、どうすれば RecyclerView をアニメーション化できますか? いくつかのカスタムルールに応じて、いくつかの要素に別の不透明度を持たせたい.


アニメーションの動きはまさに私が探しているものであるようです。そのメソッドは から呼び出されdispatchLayout()ます。そのメソッドの javadoc は次のとおりです。

レイアウトによるアニメーションの変更を処理する layoutChildren() のラッパー。アニメーションは、再生中の 5 種類のアイテムがあることを前提として動作します:
PERSISTENT: アイテムはレイアウトの前後に表示されます
REMOVED: アイテムはレイアウト前に表示され、アプリによって削除されました
ADDED: アイテムはレイアウト前には存在せず、アプリによって追加されましたアプリ
DISAPPEARING: アイテムは前後にデータ セットに存在しますが、レイアウトの過程で可視から非可視に変更されました (それらは他の変更の副作用として画面外に移動されました)
APPEARING: データ セットにアイテムが存在します前/後、しかしレイアウトの過程で非表示から表示に変更されました(他の変更の副作用として画面上に移動されました)
全体的なアプローチでは、レイアウトの前後にどのアイテムが存在するかを把握し、各アイテムについて上記の 5 つの状態のいずれかを推測します。次に、アニメーションがそれに応じて設定されます:
PERSISTENT ビューが移動されます ({@link ItemAnimator#animateMove(ViewHolder, int, int, int, int)}) REMOVED ビューが削除されます ({@link ItemAnimator#animateRemove(ViewHolder)})
ADDED ビューが追加されます ({@link ItemAnimator#animateAdd(ViewHolder)})
DISAPPEARING ビューが画面外に移動されます
APPEARING ビューが画面上に移動されます

これまでのところ、私は PERSISTENT、DISAPPEARING、および APPEARING を探していますが、この行のためにそのメソッドが呼び出されることはありません:

boolean animateChangesSimple = mItemAnimator != null && mItemsAddedOrRemoved
            && !mItemsChanged;

mItemsAddedOrRemovedは単純に常に false であるため、そのコールバックには到達しません。セットフラグを正しく設定する方法はありますか?

4

3 に答える 3

10

カスタムメソッドで を使用しOnScrollListenerてアニメーション化することになりました。animate()私の場合、そのコードはわずか 2ms しかかからないので、60fps では問題ありません。

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(int newState) {
        if(newState == RecyclerView.SCROLL_STATE_IDLE) {
            // special handler to avoid displaying half elements
            scrollToNext();
        }
        animate();
    }

    @Override
    public void onScrolled(int dx, int dy) {
        animate();
    }
});
于 2014-08-25T07:39:22.557 に答える