安卓动画(三)Recyclerview ItemAnimator(下)
前面讲了补间动画、Transition动画,属性动画,这一篇讲一讲和Recyclerview相关的动画。
Recyclerview里面有一个类ItemAnimator专门用来管理每个item变化时所对应的动画,当item被删除、添加、位置发生变化时,相应的动画就会被调用,从而给用户更好的体验,这一篇就原理、流程做一个大概的介绍。
由于ItemAnimator的流程还是比较复杂的,因为和recyclerview的layout过程是有一定耦合的而且涉及到ViewHolder的复用,因此只能简单的讲一下ItemAnimator的封装过程。ItemAnimator这个类里面有这么几个重要的方法:
public abstract boolean animateAppearance(@NonNull ViewHolder viewHolder,
@Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo);
public abstract boolean animateChange(@NonNull ViewHolder oldHolder,
@NonNull ViewHolder newHolder,
@NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo);
public abstract boolean animateDisappearance(@NonNull ViewHolder viewHolder,
@NonNull ItemHolderInfo preLayoutInfo, @Nullable ItemHolderInfo postLayoutInfo);
public abstract boolean animateAppearance(@NonNull ViewHolder viewHolder,
@Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo);
上面几个方法看名字和源码注释就可以确定分别和view的出现、消失、改变等状态对应,比如当一个item要被remove掉,那么就要对这个ViewHolder调用animateDisappearance
方法。然后还有运行动画的方法
public abstract void runPendingAnimations();
这是一个抽象方法,需要实现,主要是触发动画的开始,由于ItemAnimator
这个类比较抽象,安卓为我们封装了一个类SimpleItemAnimator
继承自RecyclerView.ItemAnimator
,而且还抛出了几个抽象方法,需要我们实现:
public abstract boolean animateAdd(RecyclerView.ViewHolder holder);
public abstract boolean animateRemove(RecyclerView.ViewHolder holder);
public abstract boolean animateChange(RecyclerView.ViewHolder oldHolder,
RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLe