动画总结分析

    xiaoxiao2026-04-09  6

    动画的分类

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


    帧动画:

    继承结构:

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

    用法:

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

    原理:

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

    start方法中,调用了setFrame方法 setFrame,通过index得到图片信息,调用selectDrawable隐藏之前显示的图片,并调用Drawable的Callback重新绘制当前选中的图片。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父容器左上角

    用法:

    从xml读取动画文件。          对于AnimationSet,则 直接通过构造方法创建。 具体查看源码构造方法。

    原理:

    View.startAnimation();保存了Animation,并请求父容器进行重新绘制。ViewGroup的draw方法中调用dispatchDraw()。dispatchDraw先处理LayoutAnimationController,即子控件的进出动画;再处理子控件的绘制,调用的是drawChild方法。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()

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

    ValueAnimator

    用法:

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

    原理:

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

    重点

    插值器 估值器
    转载请注明原文地址: https://ju.6miu.com/read-1308656.html
    最新回复(0)