滚动时回收器查看项目动画

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);