Skip to content

Commit 6085d0b

Browse files
committed
Update README.md
fix some composing errors
1 parent 6245b6d commit 6085d0b

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

listview-animations/README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ mListview.setAdapter(swingRightInAnimationAdapter);
3131
```
3232
与之前的Adapter区别在于设置mListview adapter前先用swingRightInAnimationAdapter对mYourCustomAdapter进行处理,然后传入mYourCustomAdapter,同时,给swingRightInAnimationAdapter传入调用的AbsListview。
3333
回到之前说的本质,就是在getView的时候播放动画,也就说,swingRightInAnimationAdapter肯定对getView方法进行了处理。找到`SwingRightInAnimationAdapter`类的代码,发现没有getView这个方法,继续找父类。它的父类是`SingleAnimationAdapter`,它也没有。继续找父类,`AnimationAdapter`,太棒了,里面有getView方法,我们看下内容是什么。
34+
3435
![getView](https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_getview.png)
3536
mHasParentAnimationAdapter是做什么用的呢。由于动画库可以同时叠加使用多个动画,先看下如何使用多个动画
3637
```java
@@ -42,15 +43,18 @@ swingRightInAnimationAdapter.setAbsListView(mListview);
4243
mListview.setAdapter(swingBottomInAnimationAdapter);
4344
```
4445
与上面的单个动画相比,在于swingRightInAnimationAdapter不是直接传给mListview的setAdapter,而是,传给swingBottomInAnimationAdapter的构造函数,然后,swingRightInAnimationAdaptermListview的setAdapter。可以肯定的是mAdapter,swingRightInAnimationAdapter,swingBottomInAnimationAdapter的getView方法都被调用了,上述的调用顺序为swingBottomInAnimationAdapter.getView、swingRightInAnimationAdapte.getView、mAdapter.getView。既然动画是在getView里面进行播放的,那岂不是要播放多次?为了解决这个问题,这里用mHasParentAnimationAdapter来进行标示,里层的getView有些操作是不进行的(比如播放动画),这个变量不需要人为维护,在`AnimationAdapter`里面进行了处理,代码如下。
46+
4547
![getView](https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animationadapter_constructor.png)
4648
也就是说只要传进去的adapter是`AnimationAdapter`(可以播放动画的adapter),那这个adapter就不进行某些操作。
4749
回到之前的那段多个动画组合的代码swingRightInAnimationAdapter是不进行某些操作的,动画播放等等是在swingBottomInAnimationAdapter的getView进行的,也就是最外层的`AnimationAdapter`进行动画操作。
4850
切回到`AnimationAdapter`的getView方法,这里假设Adapter是最完成的AnimationAdapter,也就是说mHasParentAnimationAdapter为false。
4951
大致的流程很简单,判断AbsListview有没有设置,然后取消之前convertView的动画(AbsListView里面的getView是循环利用view的)。接着调用父类的getView获得View对象。然后调用animateViewIfNecessary播放动画。
5052
**以上,我们就解决了在什么时候播放动画的问题**
5153
**如何播放动画以及什么时候播放动画呢**,继续看
54+
5255
![getView](https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animateviewifnecessary.png)
5356
153行判断是否该播放动画,如果大于上次播放后的最后位置,则不播放,这就是为什么在滑动时只有往后滑才会播放动画,往前滑不会播放动画的原因。然后`AnimationAdapter`还提供了一个函数setShouldAnimate来设置是否播放动画。如果满足播放动画的条件,则调用animateView播放动画,同时保存位置。
57+
5458
![getView](https://github.com/android-cn/android-open-project-analysis/raw/master/listview-animations/images/items_animation_animateview.png)
5559
animationView是播放动画的重头戏。
5660
173行调用抽象函数getAnimators(这个就是AnimationAdapter子类实现动画的地方)获取动画。
@@ -60,5 +64,6 @@ animationView是播放动画的重头戏。
6064
OK,三个问题都解决了。
6165
以上就是AbsListview的item动画,原理很简单,就是在getView里面在适当的实际播放动画而已。
6266
以下是类图(使用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

Comments
 (0)