Android動畫(一)-視圖動畫與幀動畫

項目中很久沒用過動畫了,因此關於動畫的知識都忘光了。知識老是不用則忘。正好最近的版本要添加比較炫酷的動畫效果,因此也藉着這個機會,寫博客來整理和總結關於動畫的一些知識。也方便本身從此的查閱。html

Android中的動畫分爲三類。java

  • View animation:視圖動畫,也叫作 Tween(補間)動畫。
  • Drawable animation:也叫作Frame 動畫,幀動畫。
  • Property animation: 屬性動畫。支持Android3.0以上版本。

咱們根據類別,來分別介紹。android

視圖動畫

視圖動畫是一種比較古老的,使用方式比較簡單的動畫。它能夠在一個視圖容器內執行一系列的簡單變換(好比大小,旋轉等)。它控制的是整個view。它支持四種效果。透明度旋轉縮放位移。分別對應着 Animation的四個子類,AlphaAnimation,RotateAnimation,ScaleAnimationTranslateAnimationgit

可是視圖動畫有一點須要特別注意,那就是不具有交互性。什麼意思呢?好比 一個Button進行了平移變換,已經從以前的A點,移動到了B點。可是你點擊B點,該Button沒反應,相反你點擊A點,該Button纔有反應。(雖然它的視圖已經不顯示在A點了)。因此說 視圖動畫改變的只是View的顯示,卻沒有改變View的真實佈局屬性值。github

視圖動畫能夠經過Xml或Android代碼中定義。使用起來比較方便。api

若是在xml文件中使用動畫,文件目錄是res/anim/filename.xml,而且View動畫既能夠是單個動畫,也能夠由一系列動畫組成:
它具體的使用方式以下:app

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>

在代碼中這樣應用。ide

//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
Animation myAnim = AnimationUtils.loadAnimation(this, R.anim.filename);
myView.startAnimation(myAnim);

而若是不借助於xml文件,直接在java代碼中定義,則相似這樣使用:函數

//旋轉動畫, 旋轉參考系爲自身中心點  
//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
RotateAnimation ra = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5F,
            RotateAnimation.RELATIVE_TO_SELF, 0.5F);

ra.setDuration(5000);
myView.startAnimation(ra);

知道了基本用法,那麼咱們下面要作的,就是熟悉相關api了。。(具體api內容,參考了該篇博客,在此表示感謝)。oop

Animationabstract的,它也是AlphaAnimation等視圖動畫的基類。

Animation類相關屬性方法以下:

xml屬性 java方法 解釋
android:detachWallpaper setDetachWallpaper(boolean) 是否在壁紙上運行
android:duration setDuration(long) 動畫持續時間,毫秒爲單位
android:fillAfter setFillAfter(boolean) 控件動畫結束時是否保持動畫最後的狀態
android:fillBefore setFillBefore(boolean) 控件動畫結束時是否還原到開始動畫前的狀態
android:fillEnabled setFillEnabled(boolean) 與android:fillBefore效果相同
android:interpolator setInterpolator(Interpolator) 設定插值器(指定的動畫效果,譬如回彈等)
android:repeatCount setRepeatCount(int) 重複次數
android:repeatMode setRepeatMode(int) 重複類型有兩個值,reverse表示倒序回放,restart表示從頭播放
android:startOffset setStartOffset(long) 調用start函數以後等待開始運行的時間,單位爲毫秒
android:zAdjustment setZAdjustment(int) 表示被設置動畫的內容運行時在Z軸上的位置(top/bottom/normal),默認爲normal

除此以外,Animation還有一些經常使用的方法:

Animation類的方法 解釋
reset() 重置Animation的初始化
cancel() 取消Animation動畫
start() 開始Animation動畫
setAnimationListener(AnimationListener listener) 給當前Animation設置動畫監聽
hasStarted() 判斷當前Animation是否開始
hasEnded() 判斷當前Animation是否結束

Alpha相關屬性:

xml屬性 java方法 解釋
android:fromAlpha AlphaAnimation(float fromAlpha, …) 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlpha AlphaAnimation(…, float toAlpha) 動畫結束的透明度,同上

Rotate相關屬性:

xml屬性 java方法 解釋
android:fromDegrees RotateAnimation(float fromDegrees, …) 旋轉開始角度,正表明順時針度數,負表明逆時針度數
android:toDegrees RotateAnimation(…, float toDegrees, …) 旋轉結束角度,正表明順時針度數,負表明逆時針度數
android:pivotX RotateAnimation(…, float pivotX, …) 縮放起點X座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點)
android:pivotY RotateAnimation(…, float pivotY) 縮放起點Y座標,同上規律

Scale相關屬性:

xml屬性 java方法 解釋
android:fromXScale ScaleAnimation(float fromX, …) 初始X軸縮放比例,1.0表示無變化
android:toXScale ScaleAnimation(…, float toX, …) 結束X軸縮放比例
android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y軸縮放比例
android:toYScale ScaleAnimation(…, float toY, …) 結束Y軸縮放比例
android:pivotX ScaleAnimation(…, float pivotX, …) 縮放起點X軸座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點)
android:pivotY ScaleAnimation(…, float pivotY) 縮放起點Y軸座標,同上規律

Translate相關屬性:

xml屬性 java方法 解釋
android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始點X軸座標(數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點)
android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始點Y軸從標,同上規律
android:toXDelta TranslateAnimation(…, float toXDelta, …) 結束點X軸座標,同上規律
android:toYDelta TranslateAnimation(…, float toYDelta) 結束點Y軸座標,同上規律

另外還有一個AnimationSet,它表明的是一系列動畫的組合。
在代碼當中咱們能夠這樣使用:

//@author  www.yaoxiaowen.com
//本文地址: http://www.cnblogs.com/yaoxiaowen/p/7499556.html
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);

AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(1000);
as.addAnimation(aa);

TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
ta.setDuration(1000);
as.addAnimation(ta);

btn7.startAnimation(as);

可是值得注意的是,若是咱們對AnimationSet設置了一些屬性,那麼有些屬性會影響到它所包含的子控件,而有些則不會。API文檔上是這樣解釋的。

The way that AnimationSet inherits behavior from Animation is important to understand. Some of the Animation attributes applied to AnimationSet affect the AnimationSet itself, some are pushed down to the children, and some are ignored, as follows:

  • duration, repeatMode, fillBefore, fillAfter: These properties, when set on an AnimationSet object, will be pushed down to all child animations.
  • repeatCount, fillEnabled: These properties are ignored for AnimationSet.
  • startOffset, shareInterpolator: These properties apply to the AnimationSet itself.

視圖動畫是供View使用的,而View基類中和動畫相關的經常使用方法以下:

View類的經常使用動畫操做方法 解釋
startAnimation(Animation animation) 對當前View開始設置的Animation動畫
clearAnimation() 取消當View在執行的Animation動畫

幀動畫

幀動畫是一種比較簡單的動畫,利用多張圖片就像放電影那樣輪流播放,而後就造成了動畫效果。或者說像播放幻燈片也是一個道理。由於它實質上就是多張圖,因此它也叫做 Drawable動畫。系統提供了 AnimationDrawable類來使用 幀動畫。該類和 Animation沒有繼承關係。

Goole官方demo給出的使用方式以下:

<!-- Animation frames are wheel0.png through wheel5.png
     files inside the res/drawable/ folder -->
 <animation-list android:id="@+id/selected" android:oneshot="false">
    <item android:drawable="@drawable/wheel0" android:duration="50" />
    <item android:drawable="@drawable/wheel1" android:duration="50" />
    <item android:drawable="@drawable/wheel2" android:duration="50" />
    <item android:drawable="@drawable/wheel3" android:duration="50" />
    <item android:drawable="@drawable/wheel4" android:duration="50" />
    <item android:drawable="@drawable/wheel5" android:duration="50" />
 </animation-list>

在java代碼中加載使用該動畫。

// Load the ImageView that will host the animation and
 // set its background to our AnimationDrawable XML resource.
 ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
 img.setBackgroundResource(R.drawable.spin_animation);

 // Get the background, which has been compiled to an AnimationDrawable object.
 AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();

 // Start the animation (looped playback by default).
 frameAnimation.start();

對於幀動畫,注意如下幾點就ok了。

  • android:oneshot屬性:true表示動畫只播放一次,而後中止在最後一幀上,false表示動畫循環播放。
    item表明每一幀的圖片, android:drawable表示具體圖片引用,android:duration表示每一幀停留的時間。
  • AnimationDrawable#start()方法不能夠在Activity#onCreate()方法中調用,這和AnimationDrawable還未徹底附着到window上有關,所以最好的調用時機是在Activity#onWindowFocusChanged()方法中。

Activity或fragment的切換動畫

跳轉Activity時,系統有默認的切換效果,不過咱們也能夠自定義,只要直接調用Activity中的一個方法便可,

/**
 * @author  www.yaoxiaowen.com
 * @param enterAnim   進入Activity時,所須要的動畫資源id, 傳遞 0 表明 不使用動畫效果
 * @param exitAnim   離開Activity時,所須要的動畫資源id, 傳遞 0 表明 不使用動畫效果
 */
public void overridePendingTransition (int enterAnim, int exitAnim)

可是該方法必需要緊跟着startActivity(Intent)finish()方法後面當即被調用,不然沒效果。
相似下面這樣

//www.yaoxiaowen.com
@Override
public void finish() {
    super.finish();
    overridePendingTransition(0, R.anim.exit_anim);
}

而Fragment也能夠添加切換動畫。則要使用FragmentTransaction中的這個方法。

FragmentTransaction setCustomAnimations (int enter, int exit)

不過要注意,Activityfragment添加的動畫都應該是 視圖動畫,而不是屬性動畫。


做者: www.yaoxiaowen.com

博客地址: www.cnblogs.com/yaoxiaowen/

github: https://github.com/yaowen369

歡迎對於本人的博客內容批評指點,若是問題,可評論或郵件(yaowen369@gmail.com)聯繫

歡迎轉載,轉載請註明出處.謝謝

相關文章
相關標籤/搜索