android屬性動畫(一)

jopen 8年前發布 | 18K 次閱讀 Android開發 移動開發

我們都知道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();
}

是不是有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>

然后在java文件中:

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

但也有的人問了對于width是不是可以用

android:propertyName="width"

方式寫,答案是不可以的,我們來看一下源代碼:

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。雖然很簡單,但如果真的理解透徹了,很多動畫都可以做出來,但這也只是屬性動畫的一部分,很多動畫類我這里沒有涉及到,但是那些類似 ObjectAnimatorValueAnimatorAnimatorSet的類我這里沒有講,但這也無非是多了解一些動畫的API的事,我個人是非常不愿意記那些API的,這一篇先到這里,后面我會介紹其他一些動畫常用類的用法。

來自: http://my.oschina.net/gef/blog/591597

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!