Android View動畫整理
阿新 • • 發佈:2019-01-27
動畫區分為補間動畫(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透明動畫可以通過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>
程式碼書寫格式
此方式預設旋轉中心為起始座標 view的左上角座標,因此旋轉時圍繞左上角座標旋轉。RotateAnimation rotateAnimation=new RotateAnimation(0,360); rotateAnimation.setDuration(2000);
在用程式碼書寫旋轉動畫時,可以設定旋轉的中心有相對自己也有相對父容器的: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
此方式後兩個引數為旋轉中心的座標原點點為View左上角座標。RotateAnimation rotateAnimation=new RotateAnimation(0,360,100,100);
3、位移動畫
xml書寫格式:
(以下座標均為相對於view左上角座標)<?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>
fromXDelta為起始X座標位置
fromYDelta為起始Y座標位置
toXDelta為終止點X座標位置
toYDeltr為終止點Y座標位置
程式碼書寫格式:
具體引數為起始X座標, 終止X座標; 起始Y座標,終止Y座標TranslateAnimation translateAnimation = new TranslateAnimation(0, 400, 0, 0); translateAnimation.setDuration(2000);
同樣可以寫成相對於當前View或者父容器的位置。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);
4.縮放動畫
xml格式
pivotX、pivotY為旋轉中心點位置。<?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>
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動畫做的一些整理,方便他人和自己以後檢視。