滚动时回收器查看项目动画
Recycler view item animate when scrolling
我发现并研究了很多方法,并在滚动时自定义回收器视图项目动画(space 滚动时每个项目之间会拉伸),例如 this gif, even I referred to many related library such as recyclerview-animators or RecyclerViewItemAnimators 或为每个 holder onBindViewHolder() 创建动画。但是,以上所有方法都只是在第一次加载视图时创建动画,不能像我要创建的动画那样实现。所以有人做过类似的事情,请帮我解决这个问题。非常感谢。
编辑:
我尝试按照@Android 的建议实现 OnScrollListener 方法。但它不能正常工作。下面的代码展示了我是如何实现它们的:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
int firstPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
for (int i = firstPosition; i <= lastPosition; i++) {
if (dy < 0) {
AnimationUtils.animate(recyclerView.findViewHolderForAdapterPosition(i), false);
} else {
AnimationUtils.animate(recyclerView.findViewHolderForAdapterPosition(i), true);
}
}
}
});
public class AnimationUtils {
public static void animate(RecyclerView.ViewHolder viewHolder, boolean isGoDown){
ObjectAnimator translateY = ObjectAnimator.ofFloat(viewHolder.itemView, "translationY", isGoDown == true ? 300 : -300, 0);
translateY.setDuration(300);
translateY.setInterpolator(new DecelerateInterpolator(2f));
translateY.start();
}
}
您可以像这样为 RecyclerView 项目设置动画。
您所需要的只是编写一个动画方法并在 onBindViewHolder()
方法中调用该方法。
这里是淡化 RecyclerView 项目的示例
方法
public void setFadeAnimation(View view) {
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(500);
view.startAnimation(anim);
}
调用此方法
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
setFadeAnimation(holder.itemView);
........
}
这是动画示例。
你定义lastPosition
private int lastPosition = -1;
private void setAnimation(View viewToAnimate, int position) {
if (position > lastPosition) {
Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
animation.setDuration(1000);
viewToAnimate.startAnimation(animation);
lastPosition = position;
} else if ( position < lastPosition) {
Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
然后只有你调用方法onBindViewHolder
setAnimation(viewHolder.itemView, position);
我发现并研究了很多方法,并在滚动时自定义回收器视图项目动画(space 滚动时每个项目之间会拉伸),例如 this gif, even I referred to many related library such as recyclerview-animators or RecyclerViewItemAnimators 或为每个 holder onBindViewHolder() 创建动画。但是,以上所有方法都只是在第一次加载视图时创建动画,不能像我要创建的动画那样实现。所以有人做过类似的事情,请帮我解决这个问题。非常感谢。
编辑:
我尝试按照@Android 的建议实现 OnScrollListener 方法。但它不能正常工作。下面的代码展示了我是如何实现它们的:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
int firstPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
for (int i = firstPosition; i <= lastPosition; i++) {
if (dy < 0) {
AnimationUtils.animate(recyclerView.findViewHolderForAdapterPosition(i), false);
} else {
AnimationUtils.animate(recyclerView.findViewHolderForAdapterPosition(i), true);
}
}
}
});
public class AnimationUtils {
public static void animate(RecyclerView.ViewHolder viewHolder, boolean isGoDown){
ObjectAnimator translateY = ObjectAnimator.ofFloat(viewHolder.itemView, "translationY", isGoDown == true ? 300 : -300, 0);
translateY.setDuration(300);
translateY.setInterpolator(new DecelerateInterpolator(2f));
translateY.start();
}
}
您可以像这样为 RecyclerView 项目设置动画。
您所需要的只是编写一个动画方法并在 onBindViewHolder()
方法中调用该方法。
这里是淡化 RecyclerView 项目的示例
方法
public void setFadeAnimation(View view) {
AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
anim.setDuration(500);
view.startAnimation(anim);
}
调用此方法
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
setFadeAnimation(holder.itemView);
........
}
这是动画示例。
你定义lastPosition
private int lastPosition = -1;
private void setAnimation(View viewToAnimate, int position) {
if (position > lastPosition) {
Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
animation.setDuration(1000);
viewToAnimate.startAnimation(animation);
lastPosition = position;
} else if ( position < lastPosition) {
Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
然后只有你调用方法onBindViewHolder
setAnimation(viewHolder.itemView, position);