通过RecyclerView的实现展开动画动画的时候,首先想到的是通过原生的方法notifyItemRangeChanged来实现。但是android并没有提供很多Api,让使用者来自定义动画。

为了更好的实现动画的自定义,必须查看RecyclerView动画的实现机制。在此基础上才能够有机会hook动画机制,从而实现更好的自定义。目前实现了动画的差值器、展开距离、动画时间的自定义。

从postAnimationRunner方法开始,RecyclerView的Item动画就真正的开始了。

通过postOnAnimation方法在主线程的handler中post了一个Runnable。这个Runnable中就是就是整个Item动画中心。所有Item的move、remove、add、change动画都是这里开始装载、开始的。

在runPendingAnimations方法中,我们来关注下change的动画。change动画是通过DefaultItemAnimator.ChangeInfo类来封装的,并通过列表(ArrayList<DefaultItemAnimator.ChangeInfo> mPendingChanges)来管理所有待动画的item项。ChangeInfo的添加逻辑逻辑就不在这里展开了感兴趣的同学可以查看RecyclerView源码中的dispatchLayoutStep3()方法。这里必须提出一个RecyclerView的坑,当展开的item过多时(高度过高),就没有了展开动画。

因为RecyclerView是自身height来决定加载Item数量的,所以当添加的item项的总高度大于RecyclerView高度时,这个时候之前的item项会从父View中移除。导致的结果是没item进行change动画。RecyclerView展开动画的实质就是对被展开item项下面的所有item进行translate动画。既然item已经被移除了界面,那动画肯定就没了。

下面将会请出今天的主角ViewPropertyAnimator。在animateChangeImpl方法中对itemView进行了动画的设置,其中设置了动画的时间,translateX,translateY,alpha等属性的设置。(注意这里可能会涉及到连个View的动画,这里不做展开)

重头戏终于要开始了。下面来看看属性动画是怎么来改变View属性从而实现动画的呢?是什么来驱动动画的呢?首先我们来看看ViewPropertyAnimator的startAnimation方法。通过源码分析可知,方法中主要是对ValueAnimator进行设置,可知真正的动画是通过ValueAnimator来实现的。

ValueAnimator的start方法也是暗藏玄机。其中有一方法addAnimationCallback。方法中通过AnimationHandler对象实现了属性动画的注册。

AnimationHandler可以说是来头不小,它可以说是管理者所有的属性动画。通过AnimationHandler的统一管理能够确保所有的属性动画在主线程中自信,同时确保了多个动画能够在相同的时间去修改属性,实现动画时间的统一性。

那么驱动AnimationHandler的动力是什么呢?说道动力我们就不得不请出UI届扛把子Choreographer。对于这位老大哥,大家应该都有所耳闻。在android上层的UI绘制中,每次都是他响应UI绘制请求。大家都知道在其doFrame方法中有三部曲,分别是measureHierarchy、performLayout、performDraw。

在演奏三部曲之前,Choreographer会先去执行动画,而动画的实质就是不同的时间点对View对想设置不同的属性,然后在绘制到屏幕上。实现就是在Choreographer通过AnimationHandler,在每次绘制请求到来的时候回调AnimationHandler中注册的ValueAnimator。

首先看看回调AnimationHandler的内容。

上述方法比较简单,主要是回调了doAnimationFrame方法。在doAnimationFrame中主要也是回调注册的ValueAnimator对象。

在doAnimationFrame方法中主要是基于基于时间线计算对应的值,并回调注册的监听。本例中注册的是ViewPropertyAnimator对象。下面是截取的部分源码。感兴趣的同学可以看看源码。这里不再赘述。

ValueAnimator中的回调:

ViewPropertyAnimator中的回调:

RecyclerView动画:属性动画相关推荐

  1. android imageview图片旋转动画,Android 安卓动画 属性动画 - 旋转动画

    引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西,并且也更改了其属性. 类:ObjectAnimator 用于 ...

  2. Android 安卓动画 属性动画 - 旋转动画

    引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西,并且也更改了其属性. 类:ObjectAnimator 用于 ...

  3. Android 安卓动画 属性动画 - 缩放动画

    引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西,并且也更改了其属性. 类:ObjectAnimator 用于 ...

  4. Android 安卓动画 属性动画 - 移动动画

    引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西,并且也更改了其属性. 类:ObjectAnimator 用于 ...

  5. Android 安卓动画 属性动画 - 组合动画

    引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西,并且也更改了其属性. 类:ObjectAnimator 用于 ...

  6. Android 安卓动画 属性动画 - 渐变/透明度 动画

    目录 引入 动画 - 相关文章篇 布局文件 篇 代码逻辑 篇 引入 属性动画的出现,弥补了补间动画的不足之处,补间动画,只是改变了表面上的东西,但是其中属性并未改变,而属性动画相反,改变了表面上的东西 ...

  7. android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍

    0. 前言 Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图像的 ...

  8. 三种动画方式 帧动画 属性动画 补间动画

    1.帧动画  AnimationDrawable animationDrawable = new AnimationDrawable(); //添加动画 animationDrawable.addFr ...

  9. 每日一道面试题(第7期)---Android补间动画与属性动画的区别

    零零碎碎的东西总是记不长久,仅仅学习别人的文章也只是他人咀嚼后留下的残渣.无意中发现了这个每日一道面试题,想了想如果只是简单地去思考,那么不仅会收效甚微,甚至难一点的题目自己可能都懒得去想,坚持不下来 ...

  10. android组合动画还原,Android - Fragment,View动画,组合动画,属性动画

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72876871 1.什么是Fragment 片段,碎片 * 从Android 3.0 ...

最新文章

  1. linux下的FTP服务配置
  2. 三星Galaxy Note 20系列或将于8月5日发布
  3. jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法
  4. Python 2.x vs Python 3.x(四)—— TypeError: unhashable type
  5. GDI和GUI的区别
  6. IEEE论文模板下载地址及说明
  7. 基于开源 Rexsee 的 UP 移动浏览器开放测试
  8. Android开发之高德地图导航
  9. 基于搜狗新闻语料库的词向量模型训练(Windows下)
  10. go中的interface
  11. 计算机应用后期影音制作,WindowsLive影音制作分步说明.docx
  12. 顶尖作者介绍 | 心理学领域研究“情绪”的大牛们有哪些?
  13. 【自然语言处理(NLP)】基于FNN网络的电影评论情感分析
  14. libxml使用实例
  15. TextView设置MaxLength
  16. Java毕设项目线上教学平台(java+VUE+Mybatis+Maven+Mysql)
  17. 生成对角矩阵 numpy.diag
  18. 泛微OA 子表单中文本框设置默认值不显示的问题
  19. 什么是高度塌陷 以及高度塌陷的解决办法
  20. Mysql查询统计按年月日(年、季、月、周、日)

热门文章

  1. linux shell比大小expr,Linux shell命令中expr(示例代码)
  2. 逃离360和腾讯的战场
  3. 毁尸灭迹!一次服务器被***的血泪教训
  4. 也说9158手机视频
  5. linux ubuntu桌面下载,Lubuntu 20.04 LTS 发布下载,LXQt为默认桌面
  6. ajax对于seo的影响
  7. itext 生成 PDF(二)
  8. 微信远程代码执行漏洞(最新版本利用)-亲测已上线
  9. Unity实现 下载网络资源到本地 WWW加载
  10. 蓝牙A2DP和HFP编解码