我们都知道tween 动画和帧动画都可以通过XML创建动画,然后在java文件中调用,n那么对于属性动画也是可以的,在介绍使用XML创建属性动画之前,先来说一说属性动画的原理。

对于tween animation来说,即使我们对一个控件进行了缩放或者什么操作,但控件本身的属性是没有改变的,它本来是什么属性动画过后还是什么属性,比如scaleX等。但是property animation不同,它的原理就是在一段时间内来完成属性的变化,比如rotationY,rotationX,scaleX,scaleY,给它们一个初始值和一个终点值,让它们在一段时间内变化完。

既然它叫做 property animation,那么这个属性必须有set和get方法,为什么呢:大家想一想,我们既然想通过一点点的改变属性来达到动画的效果,是不是要不断的调用控件的setXXX(),XXX就表示那个属性;那我们一开始要有一个属性的初始值,是不是调用getXXX()方法来得到这个值。比如rotaionX,我们看一下View类的源码:

public void setRotationX(float rotationX) {
    if (rotationX != getRotationX()) {
        invalidateViewProperty(true, false);
        mRenderNode.setRotationX(rotationX);
        invalidateViewProperty(false, true);

        invalidateParentIfNeededAndWasQuickRejected();
        notifySubtreeAccessibilityStateChangedIfNeeded();
    }
}
public float getRotationX() {
    return mRenderNode.getRotationX();
}
public void setRotationX(float rotationX) {
    if (rotationX != getRotationX()) {
        invalidateViewProperty(true, false);
        mRenderNode.setRotationX(rotationX);
        invalidateViewProperty(false, true);

        invalidateParentIfNeededAndWasQuickRejected();
        notifySubtreeAccessibilityStateChangedIfNeeded();
    }
}
public float getRotationX() {
    return mRenderNode.getRotationX();
}

是不是有get和set方法。好了知道这些之后,就举例子了,首先创建一个res下创建一个叫animator的文件夹,在文件夹中创建一个文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" 
    >
    <!-- 
    ordering="sequentially" 按顺序播放   
    ordering="together" 一起播放
    -->
    <objectAnimator
        android:duration="2000"
        android:valueType="floatType"
        android:propertyName="scaleX"
        android:valueFrom="1.0"
        android:valueTo="1.5"
        />
    <objectAnimator
        android:duration="2000"
        android:valueType="floatType"
        android:propertyName="scaleY"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        />

</set>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" 
    >
    <!-- 
    ordering="sequentially" 按顺序播放   
    ordering="together" 一起播放
    -->
    <objectAnimator
        android:duration="2000"
        android:valueType="floatType"
        android:propertyName="scaleX"
        android:valueFrom="1.0"
        android:valueTo="1.5"
        />
    <objectAnimator
        android:duration="2000"
        android:valueType="floatType"
        android:propertyName="scaleY"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        />

</set>

然后在java文件中:

Animator animator = AnimatorInflater.loadAnimator(this,R.animator.object);
animator.setTarget(view);
animator.start();
Animator animator = AnimatorInflater.loadAnimator(this,R.animator.object);
animator.setTarget(view);
animator.start();

但也有的人问了对于width是不是可以用

android:propertyName="width"
android:propertyName="width"

方式写,答案是不可以的,我们来看一下源代码:

public void setWidth(int pixels) {
    mMaxWidth = mMinWidth = pixels;
    mMaxWidthMode = mMinWidthMode = PIXELS;

    requestLayout();
    invalidate();
}
public final int getWidth() {
    return mRight - mLeft;
}
public void setWidth(int pixels) {
    mMaxWidth = mMinWidth = pixels;
    mMaxWidthMode = mMinWidthMode = PIXELS;

    requestLayout();
    invalidate();
}
public final int getWidth() {
    return mRight - mLeft;
}

,通过源代码我们发现setWidth居然不是设置width的,哈哈,是不是被骗了。所以当我们不属性控件的属性是,我们可以查阅源代码。


OK,到此结束,是不是so easy。虽然很简单,但如果真的理解透彻了,很多动画都可以做出来,但这也只是属性动画的一部分,很多动画类我这里没有涉及到,但是那些类似 ObjectAnimator,ValueAnimator,AnimatorSet的类我这里没有讲,但这也无非是多了解一些动画的API的事,我个人是非常不愿意记那些API的,这一篇先到这里,后面我会介绍其他一些动画常用类的用法。