@@ -31,6 +31,7 @@ mListview.setAdapter(swingRightInAnimationAdapter);
31
31
```
32
32
与之前的Adapter区别在于设置mListview adapter前先用swingRightInAnimationAdapter对mYourCustomAdapter进行处理,然后传入mYourCustomAdapter,同时,给swingRightInAnimationAdapter传入调用的AbsListview。
33
33
回到之前说的本质,就是在getView的时候播放动画,也就说,swingRightInAnimationAdapter肯定对getView方法进行了处理。找到` SwingRightInAnimationAdapter ` 类的代码,发现没有getView这个方法,继续找父类。它的父类是` SingleAnimationAdapter ` ,它也没有。继续找父类,` AnimationAdapter ` ,太棒了,里面有getView方法,我们看下内容是什么。
34
+
34
35
![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_getview.png )
35
36
mHasParentAnimationAdapter是做什么用的呢。由于动画库可以同时叠加使用多个动画,先看下如何使用多个动画
36
37
``` java
@@ -42,15 +43,18 @@ swingRightInAnimationAdapter.setAbsListView(mListview);
42
43
mListview. setAdapter(swingBottomInAnimationAdapter);
43
44
```
44
45
与上面的单个动画相比,在于swingRightInAnimationAdapter不是直接传给mListview的setAdapter,而是,传给swingBottomInAnimationAdapter的构造函数,然后,swingRightInAnimationAdaptermListview的setAdapter。可以肯定的是mAdapter,swingRightInAnimationAdapter,swingBottomInAnimationAdapter的getView方法都被调用了,上述的调用顺序为swingBottomInAnimationAdapter.getView、swingRightInAnimationAdapte.getView、mAdapter.getView。既然动画是在getView里面进行播放的,那岂不是要播放多次?为了解决这个问题,这里用mHasParentAnimationAdapter来进行标示,里层的getView有些操作是不进行的(比如播放动画),这个变量不需要人为维护,在` AnimationAdapter ` 里面进行了处理,代码如下。
46
+
45
47
![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animationadapter_constructor.png )
46
48
也就是说只要传进去的adapter是` AnimationAdapter ` (可以播放动画的adapter),那这个adapter就不进行某些操作。
47
49
回到之前的那段多个动画组合的代码swingRightInAnimationAdapter是不进行某些操作的,动画播放等等是在swingBottomInAnimationAdapter的getView进行的,也就是最外层的` AnimationAdapter ` 进行动画操作。
48
50
切回到` AnimationAdapter ` 的getView方法,这里假设Adapter是最完成的AnimationAdapter,也就是说mHasParentAnimationAdapter为false。
49
51
大致的流程很简单,判断AbsListview有没有设置,然后取消之前convertView的动画(AbsListView里面的getView是循环利用view的)。接着调用父类的getView获得View对象。然后调用animateViewIfNecessary播放动画。
50
52
** 以上,我们就解决了在什么时候播放动画的问题** 。
51
53
** 如何播放动画以及什么时候播放动画呢** ,继续看
54
+
52
55
![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animateviewifnecessary.png )
53
56
153行判断是否该播放动画,如果大于上次播放后的最后位置,则不播放,这就是为什么在滑动时只有往后滑才会播放动画,往前滑不会播放动画的原因。然后` AnimationAdapter ` 还提供了一个函数setShouldAnimate来设置是否播放动画。如果满足播放动画的条件,则调用animateView播放动画,同时保存位置。
57
+
54
58
![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animateview.png )
55
59
animationView是播放动画的重头戏。
56
60
173行调用抽象函数getAnimators(这个就是AnimationAdapter子类实现动画的地方)获取动画。
@@ -60,5 +64,6 @@ animationView是播放动画的重头戏。
60
64
OK,三个问题都解决了。
61
65
以上就是AbsListview的item动画,原理很简单,就是在getView里面在适当的实际播放动画而已。
62
66
以下是类图(使用PowerDesigner生成)
63
- ![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_class_diagram.png )
64
- 综上,动画分析就此结束。
67
+
68
+ ![ getView] ( https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_class_diagram.png )
69
+ 综上,动画分析就此结束。
0 commit comments