自定義RecyclerView.ItemAnimator其實(shí)很簡單(下)

這篇文章將向大家展示如何自定義RecyclerView.ItemAnimator,前面我們已經(jīng)分析過系統(tǒng)的DefaultItemAnimator是如何實(shí)現(xiàn)的(自定義RecyclerView.ItemAnimator其實(shí)很簡單(上)),這篇文章也是基于此實(shí)現(xiàn)的,所以沒看過的小伙伴,可以先看一下。首先,我們來看一下效果(旋轉(zhuǎn)跳躍我閉著眼...)。

a.gif

現(xiàn)在看下使用方法,只需要繼承BaseItemAnimator,然后實(shí)現(xiàn)對應(yīng)的抽象方法即可。我們先來定義一個(gè)類FadeItemAnimator繼承BaseItemAnimator,實(shí)現(xiàn)系統(tǒng)自帶的DefaultItemAnimator的效果。代碼如下所示。注釋什么很清晰,通過注釋就可以明白每個(gè)方法的作用了。這里需要注意的地方是不能為動畫設(shè)置自己想要的動畫時(shí)間,要調(diào)用getChangeDuration()getAddDuration(),getChangeDuration()來設(shè)置動畫時(shí)間或者延時(shí),這樣才能夠保持應(yīng)用RecyclerView.ItemAnimator動畫時(shí)間的一致性。所以當(dāng)設(shè)置的時(shí)間后,為了保持動畫一致性,還是會在BaseItemAnimator重新設(shè)置為對應(yīng)的RecyclerView.ItemAnimator動畫時(shí)間

package com.ivy.recyclerviewitemanimator;

import android.support.v4.animation.AnimatorCompatHelper;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.support.v7.widget.RecyclerView;

/**
 * Created by ivy on 2017/3/22.
 * Description:
 */

public class FadeItemAnimator extends BaseItemAnimator {
    /**
     * 執(zhí)行移除動畫
     * @param holder 被移除的ViewHolder
     * @param animator 被移動的ViewHolder對應(yīng)動畫對象
     */
    @Override
    public void setRemoveAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
        animator.alpha(0);
    }

    /**
     * 執(zhí)行移除動畫結(jié)束,執(zhí)行還原,因?yàn)樵揤iewHolder會被復(fù)用
     * @param view 被移除的ViewHolder
     */
    @Override
    public void removeAnimationEnd(RecyclerView.ViewHolder view) {
        ViewCompat.setAlpha(view.itemView,1);
    }

    /**
     * 執(zhí)行添加動畫初始化 這里設(shè)置透明為0添加時(shí)就會有漸變效果當(dāng)然你可以在執(zhí)行動畫代碼之前執(zhí)行
     * @param holder 添加的ViewHolder
     */
    @Override
    public void addAnimationInit(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView, 0);
    }

    /**
     * 執(zhí)行添加動畫
     * @param holder 添加的ViewHolder
     * @param animator 添加的ViewHolder對應(yīng)動畫對象
     */
    @Override
    public void setAddAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
        animator.alpha(1);
    }

    /**
     * 取消添加還原狀態(tài)以復(fù)用
     * @param holder 添加的ViewHolder
     */
    @Override
    public void addAnimationCancel(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView, 1);
    }

    /**
     * 更新時(shí)舊的ViewHolder動畫
     * @param holder 舊的ViewHolder
     * @param animator ViewHolder對應(yīng)動畫對象
     */
    @Override
    public void setOldChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
        animator.alpha(0);
    }

    /**
     * 更新時(shí)舊的ViewHolder動畫結(jié)束,執(zhí)行還原
     * @param holder
     */
    @Override
    public void oldChangeAnimationEnd(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,1);
    }

    /**
     * 更新時(shí)新的ViewHolder初始化
     * @param holder 更新時(shí)新的ViewHolder
     */
    @Override
    public void newChangeAnimationInit(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,0);
    }

    /**
     * 更新時(shí)新的ViewHolder動畫
     * @param holder 新的ViewHolder
     * @param animator ViewHolder對應(yīng)動畫對象
     */
    @Override
    public void setNewChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
        animator.alpha(1);
    }

    /**
     * 更新時(shí)新的ViewHolder動畫結(jié)束,執(zhí)行還原
     * @param holder
     */
    @Override
    public void newChangeAnimationEnd(RecyclerView.ViewHolder holder) {
        ViewCompat.setAlpha(holder.itemView,1);
    }
}

是不是很簡單?只要針對每個(gè)狀態(tài)的初始、開始、結(jié)束狀態(tài)進(jìn)行簡單的動畫和屬性設(shè)置就可以了。
所以,我們只需要直接繼承BaseItemAnimator就可以很簡單的自定義RecyclerView.ItemAnimator。

那么我對BaseItemAnimator這個(gè)類做了什么?其實(shí)也很簡單,只是把DefaultItemAnimator中關(guān)于動畫的初始、開始、結(jié)束狀態(tài)的動畫和屬性設(shè)置處抽取了抽象方法而已,其它的動畫等待、執(zhí)行、移除、還原、讓位移動邏輯都是適用任何動畫的。大家可以直接根據(jù)上篇對DefaultItemAnimator的分析以及BaseItemAnimator代碼結(jié)合查看。

源碼戳我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容