滚动时,Recycler视图项目具有动画效果

时间:2017-11-25 03:48:56

标签: android animation android-recyclerview android-animation recycler-adapter

我发现并研究了多种方式,并且在滚动时自定义回收器视图项动画(滚动时每个项目之间的空间会拉伸),如this gif,甚至我引用了许多相关库,例如recyclerview-animatorsRecyclerViewItemAnimators或为每个持有者onBindViewHolder()创建动画。但是,上面的所有方法只是在第一次加载视图时创建动画,无法实现我想要创建的动画。所以任何人都做过类似的事情,请帮我解决这个问题。非常感谢你。

编辑:

我尝试将@Sndroid推荐为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(); } }

2 个答案:

答案 0 :(得分:1)

您可以像这样为RecyclerView项目制作动画。
您只需要编写一个animate方法并在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);
    ........

}

答案 1 :(得分: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);