package com.mikepenz.lollipopshowcase.itemanimator;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import java.util.ArrayList;
import java.util.List;
public class CustomItemAnimator extends RecyclerView.ItemAnimator {
List<RecyclerView.ViewHolder> mPendingAdd = new ArrayList<>();
List<RecyclerView.ViewHolder> mPendingRemove = new ArrayList<>();
@Override
public void runPendingAnimations() {
int animationDuration = 300;
if (!mPendingAdd.isEmpty()) {
for (final RecyclerView.ViewHolder viewHolder : mPendingAdd) {
View target = viewHolder.itemView;
target.setPivotX(target.getMeasuredWidth() / 2);
target.setPivotY(target.getMeasuredHeight() / 2);
AnimatorSet animator = new AnimatorSet();
animator.playTogether(
ObjectAnimator.ofFloat(target, "translationX", - target.getMeasuredWidth(),
0.0f),
ObjectAnimator.ofFloat(target, "alpha", target.getAlpha(), 1.0f)
);
animator.setTarget(target);
animator.setDuration(animationDuration);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setStartDelay((animationDuration * viewHolder.getPosition()) / 10);
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mPendingAdd.remove(viewHolder);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator.start();
}
}
if (!mPendingRemove.isEmpty()) {
for (final RecyclerView.ViewHolder viewHolder : mPendingRemove) {
View target = viewHolder.itemView;
target.setPivotX(target.getMeasuredWidth() / 2);
target.setPivotY(target.getMeasuredHeight() / 2);
AnimatorSet animator = new AnimatorSet();
animator.playTogether(
ObjectAnimator.ofFloat(target, "translationX", 0.0f,
target.getMeasuredWidth()),
ObjectAnimator.ofFloat(target, "alpha", target.getAlpha(), 0.0f)
);
animator.setTarget(target);
animator.setDuration(animationDuration);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setStartDelay((animationDuration * viewHolder.getPosition()) / 10);
animator.start();
}
}
}
@Override
public boolean animateDisappearance(RecyclerView.ViewHolder viewHolder,
RecyclerView.ItemAnimator.ItemHolderInfo preLayoutInfo,
RecyclerView.ItemAnimator.ItemHolderInfo postLayoutInfo) {
mPendingRemove.add(viewHolder);
return false;
}
@Override
public boolean animateAppearance(RecyclerView.ViewHolder viewHolder,
ItemHolderInfo preLayoutInfo, ItemHolderInfo postLayoutInfo) {
viewHolder.itemView.setAlpha(0.0f);
return mPendingAdd.add(viewHolder);
}
@Override
public boolean animatePersistence(RecyclerView.ViewHolder viewHolder,
ItemHolderInfo preLayoutInfo, ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder,
RecyclerView.ViewHolder newHolder,
RecyclerView.ItemAnimator.ItemHolderInfo preLayoutInfo,
RecyclerView.ItemAnimator.ItemHolderInfo postLayoutInfo) {
return false;
}
@Override
public void endAnimation(RecyclerView.ViewHolder viewHolder) {
}
@Override
public void endAnimations() {
}
@Override
public boolean isRunning() {
return !mPendingAdd.isEmpty() || !mPendingRemove.isEmpty();
}
}