Android动画机制-属性动画(一)


Android动画机制-属性动画(一)

说明

Android动画机制-传统动画已经分析了Android的两种动画:逐帧动画和补间动画,那么为啥还要学属性动画呢?

没错就是,闲的!!!!!

201610211208view

补间动画的缺点

  1. 补间动画没有真正改变View的属性,仅仅改变了视图的外观。比如先给一个View设置点击事件,然后在translate动画,这时在新位置的View不能处理事件,而在点击原来位置才能处理这个事件。
  2. 动画效果单一,只有四种,比如上面的效果就很难实现,而属性动画就很简单,详情参见:自定义view和动画_PlayView
  3. 只能对View操作,而不能对非View操作。

属性动画的理解

属性动画从名字可以看出一二,它的本质就是一个数值发生器,在规定的时间内按照一定的速度进行数值的变化,从而形成动画效果,而切能够操作的值都可以被这个发生器操作。

基本使用

sp161109_182028

属性动画的根类是Animator(不同于Animation),一个是AnimatorSet就是属性动画的集合,ValueAnimator是刚刚提到的数值发生器,根据时间和差速器(变化的快慢)来改变数值。

ValueAnimator详细解释

和前面的Animation对比来介绍ValueAnimator,应该有你自己的数值变化系统(相对于Animaton的构造参数),应该有设置差速器,应该有监听,应该有设置持续时间,大致就是这些。

sp161109_182853

第一个是重复模式和内部监听接口

第二个是数值变化的发生器,注意都是可变参数

第三个是设置具体的值(不常用)

简单使用

既然属性动画的核心是一个数值发生器,那么就是先牛刀小试一个变化的数值(没有动)

        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1.0f);
        valueAnimator.setDuration(100);
        valueAnimator.start();
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float animatedValue = (float) animation.getAnimatedValue();
                System.out.println("------"+animatedValue+"------");
            }
        });

在构建VauleAnimator对象时一定要使用静态方法来创建,就是上面的ofXXXX。

sp161109_184446

数值在100毫秒内发生变化,这时引入差速器,当在设置一个setInterpolator方法时:

//添加一个线性加速器(均匀变化)
valueAnimator.setInterpolator(new LinearInterpolator());

接下来的值有规律的变化(没有太细致因为是float类型)

sp161109_184958

参考资料下载:Interpolators详解

ObjectAnimator详细解释

ValueAnimator更像一个原始的宝刀,功能更加底层,但是ObjectAnimator更适合常见的操作

简单使用

        //第一个参数表示要操作的View,第二个参数表示操作的属性,第三个是一个可变参数
        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotationY", 0, 60);
        animator.setDuration(3000);
        animator.start();

当第三个可变参数只是输入一个值,那么这个值默认是结束值,开始值默认是0。

Android动画机制-属性动画1903

属性动画果然帅,那么常见的舒心都有哪些呢?

常见可以操作的属性

  1. teanslationX和translationY控制View左上角的坐标(负责表示位移)
  2. rotation和rotationX和rotationY表示围绕支点进行2D和3D的旋转
  3. scaleX和ScaleY表示进行缩放
  4. pivotX和pivotY表示旋转和缩放的中心点
  5. alpha透明度
  6. x和y,表示View在手机坐标的最终的值,等于translatin加上View左上角最初的坐标

####rotation和rotationX和rotationY

rotationY刚刚演示了,把属性换成rotation:
Android动画机制-属性动画1907

        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotation", 0, 360);
//        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotationY", 0, 60);
        animator.setDuration(3000);
        animator.start();

在此把属性换成rotationX:

Android动画机制-属性动画1908

        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotation", 0, 360);
//        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotation", 0, 360);
//        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotationY", 0, 60);
        animator.setDuration(3000);
        animator.start();

teanslationX和translationY

Android动画机制-属性动画1909

        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "translationX", 0, 300);
        animator.setDuration(3000);
        animator.start();

就是一个简单的平移,translationY不演示了

scaleX和ScaleY

Android动画机制-属性动画1911

        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "scaleX", 1, 0.5f);
        animator.setDuration(3000);
        animator.start();

scaleY同理

pivotX和pivotY

这个表示旋转和缩放的中心点,默认在View的重心,所以他一定要结合其他动画来实现,这里先引用AnimatorSet:

Android动画机制-属性动画123

        ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(mView, "rotation", 0, 360);
        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "pivotX",0, 500);

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(3000);
        animatorSet.play(animatorRotation).with(animator);
        animatorSet.start();

Button在旋转的时候,中心点也在变化。

使用xml实现

类似Android动画机制-传统动画属性动画也可以使用xml来实现。

ValueAnimator对应animator,ObjectAnimator对应objectAnimator。

在objectAnimator标签中注意:valueType就是表示ofXXX中的xxxx就是数据类型,propertyName就是上面介绍的几个属性。

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="translationX" android:valueFrom="0"
    android:valueTo="500" android:valueType="floatType"/>

在Activity中引用这个Animator

        ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.animator);
        animator.setDuration(3000);
        animator.setTarget(mView);
        animator.start();

注意两个方法一个是和普通动画的utils不同这里使用的是:AnimatorInflater.loadAnimator

在一个就是指定View的方法setTarget


We're here to put a dent in the universe. Otherwise why else even be here?