RecyclerViewitem动画
RecyclerView item动画
RecyclerView有⼀个⽅法 RecyclerView.tItemAnimator( ),这个⽅法就是添加item动画的,该⽅法需要⼀个
RecyclerView.ItemAnimator对象。
RecyclerView.ItemAnimator
可以通过实现RecyclerView.ItemAnimator来实现
recyclerView.tItemAnimator(new RecyclerView.ItemAnimator(){
@Override
public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder,@NonNull ItemHolderInfo preLayoutInfo,@Nullable It emHolderInfo postLayoutInfo){
/**
* ViewHolder 可见 - 》不可见的时候调⽤,
* preLayoutInfo --- 布局前的item状态
* postLayoutInfo --- 布局之后的item状态
* 返回值 - true 调⽤ runPendingAnimations 启动动画
*/
return fal;
}
@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder,@Nullable ItemHolderInfo preLayoutInfo,@NonNull Item HolderInfo postLayoutInfo){
/**
ViewHolder 添加到布局的时候,即ViewHolder可见的时候调⽤
**/
return fal;
}
@Override
public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder,@NonNull ItemHolderInfo preLayoutInfo,@NonNull Item HolderInfo postLayoutInfo){
/**
ViewHolder在布局管理器布局过程中调⽤
**/
return fal;
}
热爱生活的诗句
@Override
public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder,@NonNull RecyclerView.ViewHolder newHolder,@NonNull Ite mHolderInfo preLayoutInfo,@NonNull ItemHolderInfo postLayoutInfo){
/**
当VewHolder 数据变更的时候调⽤
**/
return fal;
}
@Override
public void runPendingAnimations(){
/**
动画调⽤接⼝
**/
}
@Override
public void endAnimation(@NonNull RecyclerView.ViewHolder item){
宽慰意思
/**
停⽌指定ViewHolder的动画
**/
}
@Override
@Override
public void endAnimations(){
/
**
停⽌所有的动画
**/
}
@Override
public boolean isRunning(){
/**
标志动画是否正在运⾏
**/
return fal;
}
});
SimpleItemAnimator
可以通过SimpleItemAnimator来实现
recyclerView.tItemAnimator(new SimpleItemAnimator(){
@Override
public boolean animateRemove(RecyclerView.ViewHolder holder){
return fal;
}
@Override
public boolean animateAdd(RecyclerView.ViewHolder holder){
return fal;
}
@Override
public boolean animateMove(RecyclerView.ViewHolder holder,int fromX,int fromY,int toX,int toY){30min是什么意思
return fal;
}
@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder,int fromLeft,int fromTop,int toLeft, int toTop){
return fal;
}
@Override
public void runPendingAnimations(){
}
@Override
public void endAnimation(@NonNull RecyclerView.ViewHolder item){
}
@Override
public void endAnimations(){
农夫山泉的广告}
@Override
你是我一辈子的爱public boolean isRunning(){
return fal;
}
});
SimpleItemAnimator是继承RecyclerView.ItemAnimator,将RecyclerView.ItemAnimator的回调转变为更加语义化。关于动画的抽象接⼝则完全继承了下来没有实现。
在RecyclerView.ItemAnimator中ViewHolder的状态有
1. animateDisappearance ViewHolder 由可见到不可见状态的时候调⽤。具体可以分为移除ViewHolder和移动ViewHolder。即调⽤
animateMove或者animateRemove
2. animateAppearance ViewHolder ViewHolder 添加到布局的时候,即ViewHolder可见的时候调⽤。具体可以分为移除
ViewHolder和移动ViewHolder。即调⽤animateMove或者animateRemove
3. animatePersistence ViewHolder 在布局过程中调⽤,当布局前和布局后的坐标位置改变时,调⽤animateMove。
4. animateChange 数据变更的时候调⽤
DefaultItemAnimator
系统提供了⼀个默认的动画效果,继承SimpleItemAnimator。
class DefaultItemAnimator{
@Override
public boolean animateRemove(RecyclerView.ViewHolder holder){
// 重置 ViewHolder状态
retAnimation(holder);
// 将ViewHolder添加到list中
mPendingRemovals.add(holder);
return fal;
}
public boolean animateAdd(final RecyclerView.ViewHolder holder){
// 重置 ViewHolder状态
retAnimation(holder);
// ViewHolder的透明度为0
holder.itemView.tAlpha(0);
mPendingAdditions.add(holder);
return true;
}
// 注意向反⽅向移动
public boolean animateMove(final RecyclerView.ViewHolder holder,int fromX,int fromY,
int toX,int toY){
final View view = holder.itemView;
风华正茂的反义词
fromX +=(int) TranslationX();
fromY +=(int) TranslationY();
retAnimation(holder);
int deltaX = toX - fromX;
int deltaY = toY - fromY;
if(deltaX ==0&& deltaY ==0){
dispatchMoveFinished(holder);
return fal;
}
if(deltaX !=0){
view.tTranslationX(-deltaX);
快速缩阴
}
if(deltaY !=0){
view.tTranslationY(-deltaY);
}
mPendingMoves.add(new MoveInfo(holder, fromX, fromY, toX, toY));
return true;
}
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder,
幸福怎么写int fromX,int fromY,int toX,int toY){
if(oldHolder == newHolder){
return animateMove(oldHolder, fromX, fromY, toX, toY);
}
// ViewHolder 重绘
mPendingChanges.add(new ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY));
}
@Override
public void runPendingAnimations(){
//遍历 xxPending ,执⾏动画
}
}
从上⾯的代码可以知道item动画的基本流程
animateAdd 在动画开始前执⾏的动画变化,animateAddImpl 是在动画执⾏的过程中执⾏的动画。⽐如要⾃定义实现从左边飞⼊的效果,则在animateAdd 要将ViewHolder向右偏移⼀定的距离,在执⾏动画的时候调⽤ animateAddImpl 从平移到初始位置,即实现了从左边飞⼊的特性。
但是由于DefaultItemAnimator 的animateAddImpl 类似的接⼝⾮外部可以重写,因此实现⾃定义的Item动画需要继承SimpleItemAnimator。但是处理流程可以参考DefaultItemAnimator 。