原理:
绘制view时会调用viewGroup中的drawChild函数时,获取view的Animation的Transformation值,then调用canvas.concat(transformToApply.getMatrix),通过矩阵运算完成帧动画。
历史:
视图动画:AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation、AnimationSet(动画集合)
开启方法:
1.实例化AlphaAnimation(举例)
2.配置属性(set方法,监听器)
3.view.startAnimation(animation)
属性动画(Android 3.0):
较视图动画的优势:具备交互性。
基础:AnimatorSet 和 ObjectAnimator
ObjectAnimator使用了一个静态工厂方法创建实例。
ObjectAnimator animatior = ObjectAnimator.ofFloat(button, "translationY", 300 + i * 100); animatior.setDuration(300); LinearInterpolator ll = new LinearInterpolator(); animatior.setInterpolator(ll); animatior.start();
第一个参数是view(整个view必须要有set和get),第二个是要修改的属性【translationX和translationY、rotation和rotationX和rotationY、scaleX和ScaleY、pivotX和pivotY:支点坐标、alpha】,第三个是设置的值。
如果view中得属性没有使用set和get方法,还要使用属性动画,google提供了两个方法来解决这个问题:
1.自定义个属性类或包装类,来间接地给这个属性增加get、set方法。
2.使用ValueAnimatior
public class WrapperView { private View mTarget; public WrapperView(View target){ mTarget = target; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width = width; mTarget.requestLayout(); } }
使用时:
WrapperView wrapperView = new WrapperView(button); ObjectAnimator.ofInt(wrapperView,"width",50).setDuration(5000).start();
PropertyValuesHolder
作用:针对同一个对象的多个属性使用动画。
使用方法:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationY",300 + i * 100); PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX",1.5f); PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("alpha",0.1f); ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(button,pvh1,pvh2,pvh3); animator.setDuration(300);animator.start();
ValueAnimator
ObjectAnimator继承于ValueAnimator。
作用:本身并不具备动画的功能,而是一个数值发生器,用来产生具有一定规律的数字,进而控制动画的实现过程。
AnimatorSet
既能实现propertyValuesHolder的功能,还能提供更为精确的顺序控制。
提供play().with().before().after()、playTogether()、playSequentially()
在XML中使用属性动画
在res文件夹下建立animator文件夹,在新建文件scale.xml,内容如下:
<?xml version="1.0"encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration = "300"
android:propertyName= "scaleX"
android:valueFrom = "1.0"
android:valueTo = "2.0"
android:valueType = "floatType" />
在类中以下面的方式调用:
Animator animator = AnimatorInflater.loadAnimator(this,R.animator.scale);
animator.setTarget(button);
animator.start();
一种简便的属性动画书写方式:
android 3.0以后可以直接使用view.animate()使用属性动画。
button.animate().alpha(0.1f).scaleX(2.0f).y(300).setDuration(300).withStartAction(
new Runnable() {
@Override
public void run() {
}
}).withEndAction(new Runnable() {
@Override
public void run() {
}
}).start();
}});