android UI

属性动画

2017-06-08  本文已影响53人  黑色海鸥

学习,参考加部分信息拷贝,来自以下链接:
动画原理讲解系列:
http://blog.csdn.net/u013478336/article/details/52137385
牛逼的自定义插值器:
http://www.cnblogs.com/wondertwo/p/5327586.html
Evaluator
http://wiki.jikexueyuan.com/project/android-animation/5.html
http://wiki.jikexueyuan.com/project/android-animation/6.html 讲evaluator字母的变化
牛逼的动画原理讲解,但是没有仔细看的:
http://www.jianshu.com/p/ee7e3d79006d
其他:
http://www.jianshu.com/p/733532041f46
http://blog.csdn.net/lmj623565791/article/details/38067475/

概述

1.1 简述
属性动画引入自Android 3.0(API 11),其原理是给定对象的一个或多个属性,指定其开始与结束时的值,通过时间插值生成不同的属性值,并调用更新方法将属性值设置到对象内,引起对象重绘,从而形成动画效果。比如,通过不断的设置View的宽高来更新View的展示,形成缩放效果等。

1.2 属性动画相关概念
一个属性动画执行需要的基本要素包括:承载动画执行的对象属性、动画持续时间和属性的变化区间。

anim.addListener(new AnimatorListenerAdapter() {  
// 向addListener()方法中传入适配器对象AnimatorListenerAdapter()
// 由于AnimatorListenerAdapter中已经实现好每个接口
// 所以这里不实现全部方法也不会报错
    @Override  
    public void onAnimationStart(Animator animation) {  
    // 如想只想监听动画开始时刻,就只需要单独重写该方法就可以
    }  
});

1.3 属性动画与补间动画的区别
应用对象不同,本质不同,适用范围有包含关系。

属性动画有关类的继承关系

1.4 Interpolator vs evaluator

系统带的一些插值器.png

AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的时候快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置

1.5 动画的过程中所涉及的计算

动画计算流程图.png

ValueAnimator

ValueAnimator animator = ValueAnimator.ofInt(0, 400);
 animator.setDuration(1000);
  animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int curValue = (int) animation.getAnimatedValue();
                tv.layout(curValue, curValue, curValue + tv.getWidth(), curValue + tv.getHeight());
            }
        });
 animator.start();

PropertyValuesHolder

  1. 保存了动画过程中所需要操作的属性和对应的值。
  2. 我们通过 ofInt(Object target, String propertyName, int… values)构造的动画,ofInt()的内部实现其实就是将传进来的参数封装成 PropertyValuesHolder 实例来保存动画状态。
  3. 在封装成 PropertyValuesHolder 实例以后,后期的各种操作也是以 PropertyValuesHolder 为主的。

自定义ValueAnimator

ObjectAnimator

ValueAnimator 有个缺点,就是只能对数值对动画计算。想对哪个控件操作,需要监听动画过程,在监听中对控件操作。
为了能让动画直接与对应控件相关联,以使我们从监听动画过程中解放出来在 ValueAnimator 的基础上,又派生了一个类 ObjectAnimator;
先看看利用 ObjectAnimator 重写的 ofFloat 方法如何实现一个动画:(改变透明度)

ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"alpha",1,0,1);  
animator.setDuration(2000);  
animator.start(); 
  1. 要使用 ObjectAnimator 来构造对画,要操作的控件中,必须存在对应的属性的 set 方法
  2. setter 方法的命名必须以骆驼拼写法命名,即 set 后每个单词首字母大写,其余字母小写,即类似于 setPropertyName 所对应的属性为 propertyName ;
    set 函数调用频率是多少:动画在进行时,每隔十几毫秒会刷新一次,所以我们的 set 函数也会每隔十几毫秒会被调用一次。
    系统会根据属性通过反射找到对应属性的设置方法,刷新其值
  3. 何时需要实现对应属性的 get 函数。构造方法中最后一个参数都是可变长参数,从哪个值变到哪个值的,如果值传入了一个值,那默认值最终值,起始值就从get属性获取。

**自定义ObjectAnimator **

AnimatorSet

自定义Interpolator

public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    public AccelerateDecelerateInterpolator() {
    }

    @SuppressWarnings({"UnusedDeclaration"})
    public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }

    /** @hide */
    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator();
    }
}

换成数学表达式

{0.5*cos[(input + 1)π] + 0.5}
余弦函数.png

在0-1之间,增长速度是先变快,后匀速,最后慢慢变慢

上一篇下一篇

猜你喜欢

热点阅读