Android动画机制-属性动画(一)
说明
在Android动画机制-传统动画已经分析了Android的两种动画:逐帧动画和补间动画,那么为啥还要学属性动画呢?
没错就是,闲的!!!!!
补间动画的缺点
- 补间动画没有真正改变View的属性,仅仅改变了视图的外观。比如先给一个View设置点击事件,然后在translate动画,这时在新位置的View不能处理事件,而在点击原来位置才能处理这个事件。
- 动画效果单一,只有四种,比如上面的效果就很难实现,而属性动画就很简单,详情参见:自定义view和动画_PlayView
- 只能对View操作,而不能对非View操作。
属性动画的理解
属性动画从名字可以看出一二,它的本质就是一个数值发生器,在规定的时间内按照一定的速度进行数值的变化,从而形成动画效果,而切能够操作的值都可以被这个发生器操作。
基本使用
属性动画的根类是Animator(不同于Animation),一个是AnimatorSet就是属性动画的集合,ValueAnimator是刚刚提到的数值发生器,根据时间和差速器(变化的快慢)来改变数值。
ValueAnimator详细解释
和前面的Animation对比来介绍ValueAnimator,应该有你自己的数值变化系统(相对于Animaton的构造参数),应该有设置差速器,应该有监听,应该有设置持续时间,大致就是这些。
第一个是重复模式和内部监听接口
第二个是数值变化的发生器,注意都是可变参数
第三个是设置具体的值(不常用)
简单使用
既然属性动画的核心是一个数值发生器,那么就是先牛刀小试一个变化的数值(没有动)
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。
数值在100毫秒内发生变化,这时引入差速器,当在设置一个setInterpolator
方法时:
//添加一个线性加速器(均匀变化)
valueAnimator.setInterpolator(new LinearInterpolator());
接下来的值有规律的变化(没有太细致因为是float类型)
参考资料下载:Interpolators详解
ObjectAnimator详细解释
ValueAnimator更像一个原始的宝刀,功能更加底层,但是ObjectAnimator更适合常见的操作
简单使用
//第一个参数表示要操作的View,第二个参数表示操作的属性,第三个是一个可变参数
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotationY", 0, 60);
animator.setDuration(3000);
animator.start();
当第三个可变参数只是输入一个值,那么这个值默认是结束值,开始值默认是0。
属性动画果然帅,那么常见的舒心都有哪些呢?
常见可以操作的属性
- teanslationX和translationY控制View左上角的坐标(负责表示位移)
- rotation和rotationX和rotationY表示围绕支点进行2D和3D的旋转
- scaleX和ScaleY表示进行缩放
- pivotX和pivotY表示旋转和缩放的中心点
- alpha透明度
- x和y,表示View在手机坐标的最终的值,等于translatin加上View左上角最初的坐标
rotation和rotationX和rotationY
rotationY刚刚演示了,把属性换成rotation:
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotation", 0, 360);
// ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "rotationY", 0, 60);
animator.setDuration(3000);
animator.start();
在此把属性换成rotationX:
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
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "translationX", 0, 300);
animator.setDuration(3000);
animator.start();
就是一个简单的平移,translationY不演示了
scaleX和ScaleY
ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "scaleX", 1, 0.5f);
animator.setDuration(3000);
animator.start();
scaleY同理
pivotX和pivotY
这个表示旋转和缩放的中心点,默认在View的重心,所以他一定要结合其他动画来实现,这里先引用AnimatorSet:
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
作者官方博客:天意博文
更多好玩文章:Android动画机制-传统动画