1. 程式人生 > >Android View動畫整理

Android View動畫整理

動畫區分為補間動畫(TweenAnimation)DrawableAnimation和屬性動畫(Android3.0( Api 11)後新增的)

1.TweenAnimation補間動畫 也稱View動畫,它包括透明、旋轉、縮放和位移四中。

duration代表動畫執行時間;pivotX、pivotY代表動畫的執行中心 ,如果以自己的百分比為中心則為加% ,如果以父容器為中心則加p,如果以父容器的百分比為中心則加%p

以下是dp轉畫素和畫素轉dp

public class DensityUtils {

    /**
     * 根據手機的解析度從 dp 的單位 轉成為 px(畫素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根據手機的解析度從 px(畫素) 的單位 轉成為 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}

xml載入動畫方式均為以下格式:

Animation mAnim= AnimationUtils.loadAnimation(this, R.anim.alpha_animation);
   執行動畫可以為如下兩種格式:
1 .
mIvTest.setAnimation(mAlphaAnim);
mAlphaAnim.start();
2.
mIvTest.startAnimation(mAlphaAnim);


  1. 1.1透明動畫可以通過xml或者程式碼直接書寫 xml書寫格式:
    <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromAlpha="0.1"
        android:toAlpha="1.0"
        android:duration="5000"
        >
    </alpha>

    然後通過AnimationUtils來載入動畫然後啟動
    Animation mAlphaAnim = AnimationUtils.loadAnimation(this, R.anim.alpha_animation);
    mIvTest.startAnimation(mAlphaAnim);

    程式碼書寫格式
    AlphaAnimation alphaAnimation=new AlphaAnimation(0.1f,1.0f);
    alphaAnimation.setDuration(2000);
    if(mIvTest!= null){
        mIvTest.startAnimation(alphaAnimation);
    }

    2、旋轉動畫
    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="5000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360"></rotate>

    程式碼書寫格式
    RotateAnimation rotateAnimation=new RotateAnimation(0,360);
                rotateAnimation.setDuration(2000);
    此方式預設旋轉中心為起始座標 view的左上角座標,因此旋轉時圍繞左上角座標旋轉。

    RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
                        Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
    rotateAnimation.setDuration(2000);
    在用程式碼書寫旋轉動畫時,可以設定旋轉的中心有相對自己也有相對父容器的:
    Animation.RELATIVE_TO_SELF
    Animation.RELATIVE_TO_PARENT

    RotateAnimation rotateAnimation=new RotateAnimation(0,360,100,100);
    此方式後兩個引數為旋轉中心的座標原點點為View左上角座標。

    3、位移動畫
    xml書寫格式:
    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="5000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="100"
        android:toYDelta="100"></translate>
    (以下座標均為相對於view左上角座標)
    fromXDelta為起始X座標位置
    fromYDelta為起始Y座標位置
    toXDelta為終止點X座標位置
    toYDeltr為終止點Y座標位置

    程式碼書寫格式:
    TranslateAnimation translateAnimation = new TranslateAnimation(0, 400, 0, 0);
    translateAnimation.setDuration(2000);
    
    具體引數為起始X座標, 終止X座標; 起始Y座標,終止Y座標

    TranslateAnimation translateAnimation = new TranslateAnimation(
                        Animation.RELATIVE_TO_SELF,0.0f,//fromXtype fromXvalue
                        Animation.RELATIVE_TO_SELF,0.0f,//toXtype toXvalue
                        Animation.RELATIVE_TO_SELF,0.5f,//fromYtype fromYvalue
                        Animation.RELATIVE_TO_SELF,2.0f//toYtype toYvalue
                );
      translateAnimation.setDuration(2000);
    同樣可以寫成相對於當前View或者父容器的位置。

    4.縮放動畫
    xml格式
    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="5000"
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.5"
        android:toYScale="1.5"></scale>
    pivotX、pivotY為旋轉中心點位置。
    fromXScale為X軸方向縮放開始比例佔原View的比例。
    fromYScale為Y軸方向縮放開始比例佔原View的比例。
    toXScale為X軸方向縮放結束比例佔原View的比例。
    toYScale為Y軸方向縮放結束比例佔原View的比例。

    程式碼方式:


    通過檢視構造我們能看到有四個構造方法,其中第一個為自定義動畫,暫時不說,後面三個根據引數可以明白
    第一個為以View左上角座標開始縮放
    第二個可以指定縮放中心座標縮放
    第三個可以指定相對於本View或者父容器位置進行縮放。

    以左上角座標開始縮放
    ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1.1f, 0, 1.1f);
    scaleAnimation.setDuration(2000);

    指定縮放中心座標縮放
    ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1.1f, 0, 1.1f, DensityUtils.dip2px(this, 200), 0);
    scaleAnimation.setDuration(2000);

    指定相對於本View或者父容器的縮放中心縮放
    ScaleAnimation scaleAnimation = new ScaleAnimation(0, 1.0f, 0, 1.0f,
                        Animation.RELATIVE_TO_SELF, 1.0f,
                        Animation.RELATIVE_TO_SELF, 0.0f
                );
    scaleAnimation.setDuration(2000);


    如果想要幾個動畫結合起來使用也可以通過xml或者程式碼書寫
    xml格式
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:shareInterpolator="true">
    
        <alpha
            android:fromAlpha="0.1"
            android:toAlpha="1.0" />
        <rotate
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="720" />
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="0"
            android:toYDelta="100%" />
    
        <scale
            android:fromXScale="1.0"
            android:fromYScale="1.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1.5"
            android:toYScale="1.5" />
    </set>

    程式碼格式
    AlphaAnimation alphaAnim = new AlphaAnimation(0.1f, 1.0f);
                alphaAnim.setDuration(2000);
                ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.1f, 1.0f, 0.1f,
                        Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f
                );
                scaleAnimation.setDuration(2000);
                TranslateAnimation translateAnimation = new TranslateAnimation(
                        Animation.RELATIVE_TO_SELF,0.0f,//fromXtype fromXvalue
                        Animation.RELATIVE_TO_SELF,0.0f,//toXtype toXvalue
                        Animation.RELATIVE_TO_SELF,0.0f,//fromYtype fromYvalue
                        Animation.RELATIVE_TO_SELF,1.0f//toYtype toYvalue
                );
                translateAnimation.setDuration(2000);
                RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
                        Animation.RELATIVE_TO_SELF, 0.5f,
                        Animation.RELATIVE_TO_SELF, 0.5f);
                rotateAnimation.setDuration(2000);
                AnimationSet animSet = new AnimationSet(true);
                animSet.setDuration(2000);
                animSet.addAnimation(alphaAnim);
                animSet.addAnimation(scaleAnimation);
    
                animSet.addAnimation(rotateAnimation);
    
                animSet.addAnimation(translateAnimation);
    
                mIvTest.startAnimation(animSet);


    如果在整體的動畫執行中同時存在旋轉和位移,一般是先設定旋轉 ,後設置位移,這樣就不會出現動畫錯亂的現象。
    上面就是view動畫做的一些整理,方便他人和自己以後檢視。