項目中很久沒用過動畫了,因此關於動畫的知識都忘光了。知識老是不用則忘。正好最近的版本要添加比較炫酷的動畫效果,因此也藉着這個機會,寫博客來整理和總結關於動畫的一些知識。也方便本身從此的查閱。html
Android中的動畫分爲三類。java
- View animation:視圖動畫,也叫作 Tween(補間)動畫。
- Drawable animation:也叫作Frame 動畫,幀動畫。
- Property animation: 屬性動畫。支持Android3.0以上版本。
咱們根據類別,來分別介紹。android
視圖動畫是一種比較古老的,使用方式比較簡單的動畫。它能夠在一個視圖容器內執行一系列的簡單變換(好比大小,旋轉等)。它控制的是整個view。它支持四種效果。透明度,旋轉,縮放,位移。分別對應着 Animation
的四個子類,AlphaAnimation
,RotateAnimation
,ScaleAnimation
和TranslateAnimation
。git
可是視圖動畫有一點須要特別注意,那就是不具有交互性。什麼意思呢?好比 一個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
Animation
是abstract
的,它也是AlphaAnimation
等視圖動畫的基類。
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是否結束 |
xml屬性 | java方法 | 解釋 |
---|---|---|
android:fromAlpha | AlphaAnimation(float fromAlpha, …) | 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) |
android:toAlpha | AlphaAnimation(…, float toAlpha) | 動畫結束的透明度,同上 |
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座標,同上規律 |
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軸座標,同上規律 |
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時,系統有默認的切換效果,不過咱們也能夠自定義,只要直接調用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)
不過要注意,Activity
或fragment
添加的動畫都應該是 視圖動畫,而不是屬性動畫。
博客地址: www.cnblogs.com/yaoxiaowen/
github: https://github.com/yaowen369
歡迎對於本人的博客內容批評指點,若是問題,可評論或郵件(yaowen369@gmail.com)聯繫
歡迎轉載,轉載請註明出處.謝謝