滚动时回收器视图项目动画

Posted

技术标签:

【中文标题】滚动时回收器视图项目动画【英文标题】:Recycler view item animate when scrolling 【发布时间】: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 你得到你的解决方案了吗?我也想对滚动做同样的效果。如果您有任何想法或解决方案。请帮帮我。 【参考方案1】:

这是动画示例。

你定义 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);

【讨论】:

【参考方案2】:

您可以像这样为 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);
    ........


【讨论】:

这种方式只适用于第一次创建 itemView 持有者。我希望每次滚动回收站视图时都有动画 是的,它会给你同样的效果,因为视图是在滚动时进入前台时创建的。 我在我的应用程序中使用了这个解决方案,运行良好。如果它不适合你,请告诉我。 是的,我也使用了你推荐的方式,但是那个动画不是我想做的。愿你再次观看 gif 以了解不同之处。谢谢 提前致谢。我想如果你找到这个问题的解决方案,你会让你的应用变得更好。

以上是关于滚动时回收器视图项目动画的主要内容,如果未能解决你的问题,请参考以下文章

当另一个滚动时如何隐藏recyclerview

长按回收站查看项目动画

当我滚动 UIScrollView 时,连接到计时器的动画和滚动视图内的动画视图突然停止滴答作响

滚动时动画子视图删除冻结

当 UITableView 开始滚动时,动画视图

IOS。当 UIScrollView 滚动时应用另一个滚动动画[关闭]