解析Android中Animation動畫的編寫要點
在API Demo的View->Animation下可以找到四個Animation的Demo,第一個3D Translate比較復雜,最后再講,先講第2個Interpolator。該Activity對應的是view包內(nèi)的Animation3.java,和layout的animation_3.xml。
界面的布局不加解釋了,就一個Spinner和一個TextView。不是本文內(nèi)容。
主要解釋下幾個重點語句。
初始化Animation,從類的名字可以看出是一個變換View的位置的動畫,參數(shù)起點橫坐標,終點橫坐標,起點縱坐標,終點縱坐標。
Animation a = new TranslateAnimation(0.0f,
targetParent.getWidth() - target.getWidth() - targetParent.getPaddingLeft() -
targetParent.getPaddingRight(), 0.0f, 0.0f);
下面是動畫的參數(shù)設(shè)置,我加上了注釋
a.setDuration(1000);//設(shè)置動畫所用的時間
a.setStartOffset(300);//設(shè)置動畫啟動的延時
//設(shè)置重復模式,RESTART為結(jié)束后重新開始,REVERSE為按原來的軌跡逆向返回
a.setRepeatMode(Animation.RESTART);
//設(shè)置重復次數(shù),INFINITE為無限
a.setRepeatCount(Animation.INFINITE);
//根據(jù)用戶在Spinner的選擇設(shè)置target的進入的方式
switch (position) {
case 0:
//加速進入
a.setInterpolator(AnimationUtils.loadInterpolator(this.R.anim.accelerate_interpolator));
break;
case 1:
//減速進入
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.decelerate_interpolator));
break;
case 2:
//加速進入.與第一個的區(qū)別為當repeatMode為reverse時,仍為加速返回原點
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.accelerate_decelerate_interpolator));
break;
case 3:
//先往后退一點再加速前進
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.anticipate_interpolator));
break;
case 4:
//減速前進,沖過終點前再后退
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.overshoot_interpolator));
break;
case 5:
//case 3,4的結(jié)合體
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.anticipate_overshoot_interpolator));
break;
case 6:
//停止前來回振幾下
a.setInterpolator(AnimationUtils.loadInterpolator(this,
android.R.anim.bounce_interpolator));
break;
}
//讓target開始執(zhí)行這個動畫
target.startAnimation(a);
}
這里使用的是Android已預設(shè)的一些動作,我們也可以自定義XML來實現(xiàn)更好看的動畫效果的,這個下一篇再講。
除了TranslationAnimation,還有AlphaAnimation、RotateAnimation、ScaleAnimation,使用這幾個基體動作的組合,可以形成一系列復雜的動畫效果。具體用法請查看SDK。
整個都比較簡單,就一個函數(shù)的調(diào)用,還不懂的看一下API的注釋和SDK文檔,沒什么難理解的。
現(xiàn)在開始看第三個Push,從View->animation->Push可以啟動這個Activity
Push這個Demo主要是展示了View之間的切換效果。
Push對應的Java文件為view包內(nèi)的Animation2.java,對應的XML布局文件為layout/animation_2.xml。
先看布局文件,這個頁面內(nèi)最主要用到的是一個ViewFlipper。使用ViewFlipper可以實現(xiàn)多個View之間的動態(tài)切換,并且可以自定義切換動畫,本例中所展示的就是如何定義切換動畫。
下面只挑重點語句來講了。
讓ViewFlipper開始自動切換。
mFlipper.startFlipping();
當點擊時Spinner內(nèi)的選項時,更改進入和退出的動畫效果。
public void onItemSelected(AdapterView parent, View v, int position, long id) {
switch (position) {
case 0:
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_up_in));
mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_up_out));
break;
case 1:
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_left_in));
mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_left_out));
break;
case 2:
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this.R.anim.fade_in));
mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_out));
break;
default:
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in));
mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_out));
break;
}
}
這里的Animation都是自定義的動畫效果,可以在res/anim內(nèi)找到對應的XML文件,下面用push_up_in.xml來說明定義的大概用法。
因為這個動畫是由幾個動畫復合組成的,所以外圍就用一個set標簽括起來,組成一個AnimationSet。
translate標簽內(nèi)主要定義位置的變化情況,fromYDelta="100%p",是指從ViewFlipper的正下方剛好一個View的高度的距離的地方開始出現(xiàn),100%p是一個相對值,大于0為下方,小于0為上方。toYDelta="0",是指剛好達到布局文件的原始位置停止。android:duration="300",是指整個動作的時間用時為300毫秒,系統(tǒng)會根據(jù)這個時間自動調(diào)整速度。
alpha標簽內(nèi)定義的是透明度,0為全透明,1.0為不透明,過程為300毫秒,讓View為逐漸出現(xiàn)的過程
<set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="300"/> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" /> </set>
push_up_out.xml,和push_left的兩個標簽都幾乎一樣的,應該很好理解。
hyperspace_in.xml更簡單,只有一個alpha,所以外層沒有set標簽。startOffset是設(shè)置延遲。
hyperspace_out.xml相對復雜一點,set里面還包括有set,但仍然是由幾個小動作一起組成的,可以一點點拆成來理解。
最外層是一個set,里面嵌套一個scale和一個set。
第一個scale標簽可以理解為,以當前View的正中間位置為軸點,在700毫秒時間內(nèi),以加速放大的方式,將View的橫長變?yōu)?.4倍,高度變?yōu)?.6倍。至于fillAfter這個標簽我一直搞不懂這個功能,照SDK里的解釋,是在連續(xù)動畫中讓View保持在動畫的最后一幀,但照我的實驗似乎沒有什么效果,這個求高手指教。(查網(wǎng)上一些資料是說必須在代碼里設(shè)置,這個是不是屬于Android的Bug?)一個animationSet可以做為另一個animationSet的子集,這個很容易理解。rotate標簽內(nèi)的照字面意思應該很容易理解了,不再贅述了。
<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700" />
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700">
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400" />
</set>
</set>
很多動畫其實都是通過alpha, scale, rotate, translate這幾個基本動作組成的。這些都屬于Tween Animation。另外還有一種Frame Animation,類似放電影的效果,一幀幀播放動畫,以后再說。
所有在XML內(nèi)的設(shè)置的屬性都可以在JAVA里找到對應的API函數(shù),在Android SDK文檔里可以查得到。
其實我覺得我這樣寫得都有點啰嗦了,Android的API的名字定義都很規(guī)范,從名字都已經(jīng)可以判斷出這個函數(shù)的功能了。
3D Transition的主要定義在animation包內(nèi),里面只有兩個Java文件。
3D翻轉(zhuǎn)其實并不是很復雜,最主要的是一個函數(shù)rotation.setAnimationListener(new DisplayNextView(position));在Transition3d的第99行。這個函數(shù)的主要作用是通過一個Listener,設(shè)置動畫開始前、結(jié)束后,和重復動作時要觸發(fā)的事件。
3D翻轉(zhuǎn)效果主要由兩個rotato動作構(gòu)成,第二個動作在第一個動作完成后,由Listener來啟動。這兩個Animation連起來,看的時候就像3D旋轉(zhuǎn)的效果了。
同時,在Rotate3dAnimation.java中,重新定義了一個Animation,覆寫了initialize和applyTransformation方法。initialize是初始化動作,applyTransformation就定義動畫效果的,這個是最主要的部分,傳進來的是當前時間為總時間的百分比和動作,這里利用了轉(zhuǎn)換矩陣。發(fā)現(xiàn)我的線性代數(shù)都忘了T_T,以后要重新看一遍。主要這個Camara不太理解,注釋里也沒寫有這個類有什么用,從代碼里猜測這個是保存當前的界面。
這樣說來是簡單,但做起來難啊。。
- Android 動畫之ScaleAnimation應用詳解
- Android 動畫之TranslateAnimation應用詳解
- Android 動畫之AlphaAnimation應用詳解
- Android Animation實戰(zhàn)之屏幕底部彈出PopupWindow
- android Animation監(jiān)聽器AnimationListener的使用方法)
- android Tween Animation屬性設(shè)置方法實例
- Android中AnimationDrawable使用的簡單實例
- Android Tween動畫之RotateAnimation實現(xiàn)圖片不停旋轉(zhuǎn)效果實例介紹
- Android開發(fā)之圖形圖像與動畫(五)LayoutAnimationController詳解
- Android開發(fā)之圖形圖像與動畫(四)AnimationListener簡介
- Android開發(fā)之圖形圖像與動畫(三)Animation效果的XML實現(xiàn)
- Android開發(fā)之圖形圖像與動畫(二)Animation實現(xiàn)圖像的漸變/縮放/位移/旋轉(zhuǎn)
- Android 動畫之RotateAnimation應用詳解
相關(guān)文章
Android Studio實現(xiàn)仿微信APP門戶界面詳解及源碼
這篇文章帶你通過Android studio來實現(xiàn)微信APP的門戶界面,主要說明框架的各部分功能與實現(xiàn)過程,下文包含了整個開發(fā)過程,以及解決問題的思路并再末尾提供了源碼鏈接2021-10-10
Android實現(xiàn)電子羅盤(指南針)方向傳感器的應用
今天小編就為大家分享一篇關(guān)于Android實現(xiàn)電子羅盤(指南針)方向傳感器的應用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android中RecyclerView 滑動時圖片加載的優(yōu)化
本篇文章主要介紹了Android中RecyclerView 滑動時圖片加載的優(yōu)化,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Android開發(fā)之Notification通知用法詳解
這篇文章主要介紹了Android開發(fā)之Notification通知用法,結(jié)合實例形式較為詳細的分析了Notification通知的功能、參數(shù)、定義及使用方法,需要的朋友可以參考下2016-11-11
Android編程之自定義AlertDialog(退出提示框)用法實例
這篇文章主要介紹了Android編程之自定義AlertDialog(退出提示框)用法,結(jié)合實例形式較為詳細的分析了自定義AlertDialog的頁面布局與功能實現(xiàn)相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android開發(fā)實現(xiàn)ListView部分布局監(jiān)聽的方法
這篇文章主要介紹了Android開發(fā)實現(xiàn)ListView部分布局監(jiān)聽的方法,結(jié)合實例形式分析了Android通過設(shè)置tag標志位實現(xiàn)ListView部分布局監(jiān)聽的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

