1. 程式人生 > >Android Animation之ScaleAnimation用法詳解

Android Animation之ScaleAnimation用法詳解

ScaleAnimation用法詳解

ScaleAnimation是Animation的子類,其有四個構造方法:

1、publicScaleAnimation(Context context, AttributeSet attrs)
方法的兩個引數中context就不再解釋了,上下文變數,attrs是屬性集。一般很少利用該構造方法構造ScaleAnimation,因為還要在XML檔案裡設定屬性的值,比較麻煩,不建議使用。

2、publicScaleAnimation(float fromX, float toX, float fromY, float toY)

fromX表示x座標軸上動畫的起始位置,這個值並不是座標,而是一個比例,比如fromX=0.5f,那麼就表示播放動畫的控制元件的x座標都要乘以0.5,這是播放動畫時控制元件的初始的x軸的狀態,toX表示動畫結束時控制元件x軸方向的位置,同樣也是個比例,比如toX=1.0f,那麼動畫結束時x軸方向上控制元件恢復原狀,fromY和toY是Y分別是表示Y軸方向上動畫的初始位置和結束位置,也都是一個比例值。該情況下下座標系是控制元件左上角為原點的。

程式碼例子:

final Animation testAnimation = newScaleAnimation(0.5f,1.0f,1.0f,1.0f);
testAnimation.setFillAfter(true);
testAnimation.setDuration(1000);
imageView.setOnClickListener(newView.OnClickListener() {
           @Override
           public void onClick(View v) {
               imageView.startAnimation(testAnimation);
           }
       });

程式碼解讀:動畫一開始的時候,控制元件的每個點的x座標都乘以0.5,y座標不變,即水平方向上向左壓縮一半,動畫結束的時候控制元件的每個點的x座標恢復原值,y座標也為原始值。setFillAfter(true)的作用是動畫結束時保持結束的位置不動,setDuration(1000)是將動畫時長設為1000ms。

3、publicScaleAnimation(float fromX, float toX, float fromY, float toY,float pivotX,float pivotY)

該構造方法中有6個引數,前4個引數的意義和構造方法2的引數一樣,不再贅述,這裡重點說一下後兩個引數的用法,pivotX和pivotY是一個點的橫、縱座標,這個座標是真正的座標值,而不再是一個比例,座標系還是取控制元件的左上點為原點,我們記這個點為P,點P有什麼作用呢?它的作用就是作為一個固定點,在動畫播放的過程中,這個點保持不動,而周圍的點圍繞著這點進行縮放。在構造方法2中,pivotX和pivotY的值都為0,即相對於控制元件的左上角的那個點進行縮放變換。

程式碼舉例:

final Animation testAnimation = newScaleAnimation(0.5f,0.8f,0.5f,0.8f,500.0f,0.0f);
testAnimation.setFillAfter(true);
testAnimation.setDuration(1000);
imageView.setOnClickListener(newView.OnClickListener() {
           @Override
           public void onClick(View v) {
               imageView.startAnimation(testAnimation);
           }
       });

程式碼解讀:初始化動畫的時候,後兩個引數為500.0f和0.0f,這意味著縮放要圍繞點(500.0f,0.0f)進行,變換過程為控制元件的各個點的x座標從(500-x)*0.5+x變化到(500-x)*0.8+x,y座標從(500-y)*0.5+y變化到(500-y)*0.8+y,當然,x軸方向和y軸方向的變化是同時進行的。

4、publicScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType,floatpivotXValue, int pivotYType, float pivotYValue)

該構造方法一共有8個引數,前4個引數的意義和構造方法2的4個引數相同,這裡重點說一下後面4個引數的意義,總的來說後面4個引數的作用和構造方法3的後兩個引數一樣,是為了設定一個固定點,使得縮放是相對於這個固定點進行的。pivotXType和pivotYType指定的是一種型別,這兩個引數的值一般是一致的,取值是Animation. ABSOLUTE、Animation.RELATIVE_TO_SELF、Animation.RELATIVE_TO_PARENT三者之一。

(1)      如果pivotXType和pivotYType取值為Animation. ABSOLUTE,那麼pivotXValue和pivotYValue表示的是座標的絕對值,這時構造方法4的所起的的效果和構造方法3相同,這裡不再詳細解釋了;

(2)      如果pivotXType和pivotYType取值為Animation. RELATIVE_TO_SELF,pivotXValue和pivotYValue的值的是百分比(1表示100%),縮放的固定點就是(width*pivotXValue,height*pivotYValue),width和height分別是控制元件的寬度和高度,座標系的原點還是控制元件的左上角。比如pivotXValue = 0.5f, pivotYValue=0.5f,那麼所設定的固定點就是控制元件的中心點,縮放動畫是相對於控制元件的中心進行的,程式碼舉例:

final Animation testAnimation = newScaleAnimation(0.5f,0.8f,0.5f,0.8f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        imageView.setOnClickListener(newView.OnClickListener() {
            @Override
            public void onClick(View v) {
               imageView.startAnimation(testAnimation);
            }
        });
        testAnimation.setFillAfter(true);
       testAnimation.setDuration(1000);

(3)      如果pivotXType和pivotYType取值為Animation. RELATIVE_TO_Parent,pivotXValue和pivotYValue的值的是百分比(1表示100%),縮放的固定點就是(width*pivotXValue,height*pivotYValue),width和height分別是控制元件的父容器的寬度和高度,座標系的原點還是該控制元件的左上角。比如pivotXValue = 0.5f, pivotYValue=0.5f,那麼所設定的固定點就是控制元件的中心點,縮放動畫是相對於控制元件的中心進行的,程式碼舉例:

final Animation testAnimation = newScaleAnimation(0.5f,0.8f,0.5f,0.8f,Animation.RELATIVE_TO_PARENT,0.0f,Animation.RELATIVE_TO_PARENT,0.5f);
        imageView.setOnClickListener(newView.OnClickListener() {
            @Override
            public void onClick(View v) {
               imageView.startAnimation(testAnimation);
            }
        });
        testAnimation.setFillAfter(true);
       testAnimation.setDuration(1000);
 

 以上是ScaleAnimation的4種構造方法的簡單講解,一般初始化後,在設定一些屬性值,比如setFillAfter、setDuration之後,就可以給控制元件用了,呼叫方法是View.startAnimation(Animation anim)。理解ScaleAnimation的構造方法的引數的準確意義,基本上就可以滿足對縮放動畫的基本的需求了。