动画总结分析

动画的分类

1.帧动画
2.补间动画
3.属性动画


帧动画:

继承结构:

–drawable
    –DrawableContainer
        –AnimationDrawable
可见:AnimationDrawable是继承的drawable。

用法:

  1. 在drawable目录下定义一个XML动画文件,根节点为animation-list,中间节点为item(item设置好图片和播放时间)
  2. 设置需要播放图片动画的ImageView的src属性。
  3. 代码中通过ImageView.getDrawable方法,获取到drawable,并强转成AnimationDrawable。
  4. AnimationDrawable.start()启动动画。

原理:

AnimationDrawable中保存有多张图片信息,按照顺序依次显示图片。

  1. start方法中,调用了setFrame方法
  2. setFrame,通过index得到图片信息,调用selectDrawable隐藏之前显示的图片,并调用Drawable的Callback重新绘制当前选中的图片。
  3. setFrame中接着调用scheduleSelf,执行run方法,run方法中执行了nextFrame,依次逐帧播放每一张图片。

补间动画

继承结构:

–Animation
    –AnimationSet
    –RotateAnimation
    –ScaleAnimtation
    –AlphaAnimation
    –TranslateAnimation

XML文件对应
RotateAnimation–> rotate
ScaleAnimation–>scale
AlphaAnimation–>alpha
TranslateAnimation–>translate
属性说明:50:50px 50%相对自己的左上角 50%p父容器左上角

用法:

  1. 从xml读取动画文件。
    这里写图片描述
    这里写图片描述
             对于AnimationSet,则
    这里写图片描述
  2. 直接通过构造方法创建。
    具体查看源码构造方法。

原理:

  1. View.startAnimation();保存了Animation,并请求父容器进行重新绘制。
  2. ViewGroup的draw方法中调用dispatchDraw()。
  3. dispatchDraw先处理LayoutAnimationController,即子控件的进出动画;再处理子控件的绘制,调用的是drawChild方法。
  4. drawChild。每个动画都重载了Animation的applyTransformation方法,通过getTransformation可以获取到当前时间点的Transformation对象(封装了matrix和alpha),然后canvas应用这个变换矩阵和alpha,最后再进行绘制图像。

属性动画

继承结构:

–Animator
    –AnimatorSet
    –ValueAnimator
         –ObjectAnimator
         –TimeAnimator

AnimatiorSet

用法

Animatorset s = new AnimatorSet();
s.play(anim1).with(anim2)
s.play(anim2).after(anim3)
s.start()

原理

AnimatorSet包括以下几个类:
- Node:记录当前动画和当前动画的关系集合。
- Depdency:记录一个Node和关系(with,after)
- Builder:管理Animator之间的关系。Builder.with,after,before来设置关系。

start()

  1. Duration>0,为所有的动画设置统一的duration。
  2. interpolator!=null,为所有动画设置统一的interpolator。 对动画Node节点进行排序。
  3. 先找出没有依赖其他的节点,组成roots
  4. roots中找出被其他依赖的节点。(with,after,before都会调用addDepdency方法会在节点中添加依赖,并且在两个节点上互相添加节点记录)
  5. 根据依赖关系为动画添加监听事件。 启动没有依赖关系的节点动画,监听事件中会依次启动其他依赖动画。

ValueAnimator

用法:

  1. 插值器:插值器是用来计算当前已经过的时间和属性值的改变比
  2. 估值器:通过属性值的改变比例估算当前属性值。
  3. 监听器:监听动画的改变
  4. 常用的方法(getAnimatedValue、getAnimatedFraction、其他一些set方法)

原理:

  1. 先使用PropertyValueHolder保存属性值。
  2. 设置好duration,interpolator,evaluator
  3. 调用start()方法开始执行动画
  4. start()中调用了animationHandler执行doAnimationFrame
  5. doAnimatorFrame调用了animatorFrame,最后调用了animtionValue方法
  6. animationValue先调用插值器的getInterpolation,获取当前的时间过去比例;再根据PropertyValueHolder.calculateValue计算当前的属性值。
  7. calculateValue中,调用了KeyFrameSet的getValue方法,这个方法会根据之前设置的Evaluator来进行估值,PropertyValueHolder保存估算的值,通过getAnimatedValue获取到。

重点

  1. 插值器
  2. 估值器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值