美文网首页Android学习RecyclerView
自定义RecyclerView.ItemAnimator其实很简

自定义RecyclerView.ItemAnimator其实很简

作者: 锋ivy | 来源:发表于2017-03-29 17:12 被阅读1350次

    这篇文章将向大家展示如何自定义RecyclerView.ItemAnimator,前面我们已经分析过系统的DefaultItemAnimator是如何实现的(自定义RecyclerView.ItemAnimator其实很简单(上)),这篇文章也是基于此实现的,所以没看过的小伙伴,可以先看一下。首先,我们来看一下效果(旋转跳跃我闭着眼...)。

    a.gif

    现在看下使用方法,只需要继承BaseItemAnimator,然后实现对应的抽象方法即可。我们先来定义一个类FadeItemAnimator继承BaseItemAnimator,实现系统自带的DefaultItemAnimator的效果。代码如下所示。注释什么很清晰,通过注释就可以明白每个方法的作用了。这里需要注意的地方是不能为动画设置自己想要的动画时间,要调用getChangeDuration()getAddDuration()getChangeDuration()来设置动画时间或者延时,这样才能够保持应用RecyclerView.ItemAnimator动画时间的一致性。所以当设置的时间后,为了保持动画一致性,还是会在BaseItemAnimator重新设置为对应的RecyclerView.ItemAnimator动画时间

    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 {
        /**
         * 执行移除动画
         * @param holder 被移除的ViewHolder
         * @param animator 被移动的ViewHolder对应动画对象
         */
        @Override
        public void setRemoveAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
            animator.alpha(0);
        }
    
        /**
         * 执行移除动画结束,执行还原,因为该ViewHolder会被复用
         * @param view 被移除的ViewHolder
         */
        @Override
        public void removeAnimationEnd(RecyclerView.ViewHolder view) {
            ViewCompat.setAlpha(view.itemView,1);
        }
    
        /**
         * 执行添加动画初始化 这里设置透明为0添加时就会有渐变效果当然你可以在执行动画代码之前执行
         * @param holder 添加的ViewHolder
         */
        @Override
        public void addAnimationInit(RecyclerView.ViewHolder holder) {
            ViewCompat.setAlpha(holder.itemView, 0);
        }
    
        /**
         * 执行添加动画
         * @param holder 添加的ViewHolder
         * @param animator 添加的ViewHolder对应动画对象
         */
        @Override
        public void setAddAnimation(RecyclerView.ViewHolder holder,ViewPropertyAnimatorCompat animator) {
            animator.alpha(1);
        }
    
        /**
         * 取消添加还原状态以复用
         * @param holder 添加的ViewHolder
         */
        @Override
        public void addAnimationCancel(RecyclerView.ViewHolder holder) {
            ViewCompat.setAlpha(holder.itemView, 1);
        }
    
        /**
         * 更新时旧的ViewHolder动画
         * @param holder 旧的ViewHolder
         * @param animator ViewHolder对应动画对象
         */
        @Override
        public void setOldChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
            animator.alpha(0);
        }
    
        /**
         * 更新时旧的ViewHolder动画结束,执行还原
         * @param holder
         */
        @Override
        public void oldChangeAnimationEnd(RecyclerView.ViewHolder holder) {
            ViewCompat.setAlpha(holder.itemView,1);
        }
    
        /**
         * 更新时新的ViewHolder初始化
         * @param holder 更新时新的ViewHolder
         */
        @Override
        public void newChangeAnimationInit(RecyclerView.ViewHolder holder) {
            ViewCompat.setAlpha(holder.itemView,0);
        }
    
        /**
         * 更新时新的ViewHolder动画
         * @param holder 新的ViewHolder
         * @param animator ViewHolder对应动画对象
         */
        @Override
        public void setNewChangeAnimation(RecyclerView.ViewHolder holder, ViewPropertyAnimatorCompat animator) {
            animator.alpha(1);
        }
    
        /**
         * 更新时新的ViewHolder动画结束,执行还原
         * @param holder
         */
        @Override
        public void newChangeAnimationEnd(RecyclerView.ViewHolder holder) {
            ViewCompat.setAlpha(holder.itemView,1);
        }
    }
    

    是不是很简单?只要针对每个状态的初始、开始、结束状态进行简单的动画和属性设置就可以了。
    所以,我们只需要直接继承BaseItemAnimator就可以很简单的自定义RecyclerView.ItemAnimator

    那么我对BaseItemAnimator这个类做了什么?其实也很简单,只是把DefaultItemAnimator中关于动画的初始、开始、结束状态的动画和属性设置处抽取了抽象方法而已,其它的动画等待、执行、移除、还原、让位移动逻辑都是适用任何动画的。大家可以直接根据上篇对DefaultItemAnimator的分析以及BaseItemAnimator代码结合查看。

    源码戳我

    相关文章

      网友评论

      • 地球是猿的:贴代码的时候能不能把BaseItemAnimator的代码也一起贴出来,不然我们还得下载源码才能看。
      • 北邙山之光:老哥牛逼

      本文标题:自定义RecyclerView.ItemAnimator其实很简

      本文链接:https://www.haomeiwen.com/subject/girgnttx.html