如何像 Google plus/Google 报亭一样在滚动上为 recyclerview 制作动画?

问题描述 投票:0回答:5

当项目第一次出现以及用户滚动时,如何为

RecyclerView
制作动画,就像它在 google plus 应用程序或 google newsstand 应用程序中的工作方式一样。

我还在某处读到,当用户滚动时,

RecyclerView
不直接支持动画;如果这是真的,我们还有什么办法可以做到吗?

android scroll android-animation android-recyclerview
5个回答
85
投票

我就是这样做的。可能会帮助某人。我不知道这是否是最好的方法,但对我来说效果很好。

更新: 要修复快速滚动行为,请覆盖适配器的

onViewDetachedFromWindow
方法并在动画视图上调用
clearAnimation
(在本例中为
holder.itemView.clearAnimation()
)。像这样:

 @Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    holder.itemView.clearAnimation();
}

up_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="100%" android:toYDelta="0%"
    android:duration="400" />
</set>

down_from_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="-100%" android:toYDelta="0%"
    android:duration="400" />
</set>

最后把这段代码放在

onBindViewHolder
recyclerView
中。创建一个名为lastPosition的字段并将其初始化为-1。

Animation animation = AnimationUtils.loadAnimation(context,
            (position > lastPosition) ? R.anim.up_from_bottom
                    : R.anim.down_from_top);
    holder.itemView.startAnimation(animation);
    lastPosition = position;

3
投票

https://github.com/wasabeef/recyclerview-animators

在我的代码中是这样的:

import jp.wasabeef.recyclerview.animators.adapters.AlphaInAnimationAdapter;

....

public function populate() {
   // Get your recicleview
   rv = (RecyclerView)findViewById(R.id.rv);
   rv.setHasFixedSize(true);

   // Populate your cursor with your own method...
   Cursor myRecycleItems= null;
   myRecycleItems= mDbHelper.getItems();

   //create your 
   itemsAdapter= new ItemsAdapter(myRecycleItems, getApplicationContext());


   //Finnaly apply your adapter to RV with AlphaInAnimationAdapter:
   rv.setAdapter(new AlphaInAnimationAdapter(itemsAdapter));

}

您需要将依赖项添加到您的gradle中

dependencies {
  // jCenter
  ...... 
  your curent dependencies 
  ....
  compile 'jp.wasabeef:recyclerview-animators:2.0.0'
}

阅读文档表单 https://github.com/wasabeef/recyclerview-animators 进行安装。


2
投票

对于 down_from_top.xml 应该是

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="-100%" android:toYDelta="0%"
    android:duration="400" />
</set>

0
投票

在方法onBindViewHolder中的RecycleView.Adapter中没有任何外部库,请使用动画,如示例所示:

       if (position>lastAnimatedPosition) {


        //set init transitionY to animate from it
        holder.itemView.setTranslationY(holder.itemView.getHeight());

        //animate to orginal position
        holder.itemView.animate().translationYBy(-  holder.itemView.getHeight()).start();


        lastAnimatedPosition=position;
    }

上面的代码将从列表中的每一行的底部开始动画。动画只会执行一次,但 onBindViewHolder 是在滚动时运行的,因此列表的第一次滚动将具有动画效果。

非常重要的是初始化视图以开始动画,因此在示例中我设置:

  holder.itemView.setTranslationY( + Y change);

然后动画回到原来的位置:

 holder.itemView.animate().translationYBy(- Y change).start();

如果您需要阿尔法,请这样做:

 holder.itemView.setAlpha(0);
 holder.itemView.animate().apha(1).start();

0
投票

对于滚动动画,您可以在

recyclerView.findChildViewUnder(x, y)
侦听器中使用
onScrolled()
,如下所示:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        var layoutManager = recyclerView.getLayoutManager());
        var displayMetrics = getResources().getDisplayMetrics();
        var xPointToQuery = displayMetrics.widthPixels / 2;

        var view = recyclerView.findChildViewUnder(xPointToQuery, 0);
        if (view != null) {
            // 'view' is the item that is now horizontally centered on screen, animate it
        }
    }
});

上面的代码适用于 recyclerview 全屏水平滚动的情况,但你明白了。

© www.soinside.com 2019 - 2024. All rights reserved.