介绍
这是本教程的第二部分,也是最后一部分。第一部分我们讲述了RecyclerView用于列表的例子,文章见:
在第一部分中我们演示了如何使用自定义的动画渲染一个RecyclerView的初始加载。采用的是LayoutAnimation,效果也不错。这篇文章我们谈谈如何用类似的方法去处理grid。
本教程的demo项目List和Grid的例子都有,在这里:
apk见 这里!
为什么grid场景下会有所不同?
首先采用第一部分中的方法完全可以在grid上很好的工作,没有crash,动画也是相同的运作方式。但是 LayoutAnimation与使用GridLayoutManager的RecyclerView得到的结果是这样的:
1503131496370933.gif
左边是LayoutAnimation的grid,右边是我们想要的效果。
之所以会这样是因为item的动画是基于它在grid中的线性位置来的(从左到右,从上到下),所以才会制造出奇怪的动画。我们想要的是不同列与行上的item同时运行,这样就能减短持续时间。概括起来就是我们需要对动画的顺序和延迟有更多的控制。
所以开始吧
为了解决这个问题,我们将使用GridLayoutAnimation。基本上它就是一个LayoutAnimation,但是可以为行与列定义delay,同时还允许设置 layout animation的方向。这就使得我们能更好的控制一个特定item的动画,更容易让多个item的动画同时运行。
首先在 res/anim/下创建一个名为grid_layout_animation_from_bottom.xml的文件,然后添加:
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_from_bottom"
android:animationOrder="normal"
android:columnDelay="15%"
android:rowDelay="15%"
android:direction="top_to_bottom|left_to_right"
/>
其中:
android:animation="@anim/item_animation_from_bottom”
定义布局中的每个item所要应用的动画
android:animationOrder="normal"
可以选择三种类型:normal, reverse 以及 random。它控制内容动画的顺序。Normal:遵循direction和delay所定义的顺序;Reverse的顺序恰好跟Normal相反;Random为随机的顺序。
android:columnD