【发布时间】:2018-05-09 00:12:15
【问题描述】:
我发现并研究了很多方法,并在滚动时自定义回收器视图项目动画(滚动时每个项目之间的空间会拉伸),例如 this gif,即使我提到了许多相关库,例如 recyclerview-animators 或 RecyclerViewItemAnimators 或为每个持有者 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.OnScrollListener 的类,该类根据滚动速度(onScrolled 中的 dy 或 dx)调整视图的高度。然后根据您是向上还是向下滚动,将视图重力设置为顶部/底部。
-
@Android 我花了 2 多天时间按照您为我推荐的方式自定义 RecyclerView.OnScrollListener 回调。但它工作不正常,现在我没有任何想法来解决这个问题。你能详细描述一下还是假设另一种方式?非常感谢
-
@HayTrần 你得到你的解决方案了吗?我也想对滚动做同样的效果。如果您有任何想法或解决方案。请帮帮我。
标签: android animation android-animation android-recyclerview