Android - 动画

参考文章: http://hujiaweibujidao.github.io/blog/2016/05/26/when-math-meets-android-animation/  

      http://www.cnblogs.com/wondertwo/p/5295976.html

      http://blog.csdn.net/eclipsexys/article/details/38401641

 

一、视图动画

  主要相关类:Animation、AlphaAnimation\ScaleAnimation\RotateAnimation\TranslateAnimation、AnimationSet

  1)xml 方式定义动画,shareInterpolator="true" 表示动画集合中的所有动画共享插值器,反之shareInterpolator="false" 表示不共享插值器;

        Animation ani = AnimationUtils.loadAnimation(this, R.anim.ani_view);  加载xml动画

  2)代码方式

  3)自定义视图动画需要继承 android.view.animation.Animation ,重写initialize() 和 applyTransformation()

    initialize() : 方法对一些变量进行初始化

    applyTransformation(float interpolateTime,Transformation t): 通过矩阵修改动画数值,控制动画实现过程;该方法在动画执行过程中不断被调用;

        interpolateTime:当前动画进行时间与总时间的比值[0,1];
        t: 当前动画对象,t.getMatrix()获得Matrix矩阵对象;  

 

二、属性动画

    

  1) ObjectAnimator 是属性动画中重要的一个实现类;通过其静态工厂方法创建ObjectAnimator对象;

      ObjectAnimator.ofFloat()、ObjectAnimator.ofInt()、ObjectAnimator.ofObject()

    这些静态工厂方法接收的参数分别为:1、要设置动画的目标对象;2、动画的属性类型(目标对象需要提供getter/setter方法);3、一个或多个属性值,当指定一个属性值,默认为结束值;当指定两个属性值,默认为起始和结束值;当指定三个或以上,默认为线性插值;

  2) ValueAnimator 属性动画核心类,主要方法有 addUpdateListener(),该监听器封装了动画逻辑

  3) 插值器  Interpolator ,主要函数  float getInterpolation(float input);

     输入参数:input,该值由系统经过计算后传入,随着动画的运行匀速增长,变化范围[0,1]

     输出结果: ValueAnimator.getAnimatedFraction(); 实例函数获取的就是该值

     AccelerateDecelerateInterpolator (先加速后减速) 源码:

  【(float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f】 翻译为数学公式:【0.5*cos[(input + 1)π] + 0.5 】-> 【0.5*cos(x)+0.5 , x∈[π,2π]】

 https://www.desmos.com/calculator

  4) 估值器 TypeEvalutors , 主要方法 evaluate() 根据TimeInterpolation计算得到的因子、属性的开始值与结束值一起计算出当前时间的属性值;

    android 提供了几个evalutor:IntEvaluator(值类型为int)、FloatEvaluator、ArgbEvaluator(值类型为十六进制颜色值)

1
2
3
4
5
6
7
8
public class FloatEvaluator implements TypeEvaluator { 
        public Object evaluate(float fraction, Object startValue, 
                Object endValue) { 
            float startFloat = ((Number) startValue).floatValue(); 
            return startFloat + fraction 
                    * (((Number) endValue).floatValue() - startFloat); 
        
    }

 

5) 整理总结:

  ValueAnimator就是一个数值产生器, 计算动画变化过程中的值, 包含开始值、结束值、持续时间等, 但并没有把计算出的值应用到具体的对象上;

  要将计算的值应用到对象上, 需要注册AnimatorUpdateListener, 由该监听器负责动画逻辑;

  ValueAnimator封装了一个TimeInterpolator 和一个TypeEvaluator, TimeInterpolator定义了属性值在开始值与结束值之间的插值方法, TypeEvaluator根据TimeInterpolator计算得到的值、开始值和结束值计算出当前时间属性值;

  ValueAnimator 根据动画运行时间与总时间计算出一个时间因子(0~1), 然后TimeInterpolator根据时间因子计算出一个插值因子, 最后TypeEvaluator根据插值因子计算出属性值;

          

 

圆点旋转动画:

  1)android:shape="oval" , 需要设置宽高一致才显示为圆形;

  2)ImageView需要嵌套在LinearLayout中,旋转原理如图所示;

 

 

 

  

posted @   chenyizh  阅读(158)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示