前言
上篇我們介紹了視圖動畫肠缔,說的確切點應該是視圖動畫中的補間動畫(Tween Animation),關于逐幀動畫(Frame Animation)用法更簡單上陕,這里先不做介紹后期再自定義View的使用會用到桩砰,到時候講解拓春。這篇我們來一起學習將上篇用XML實現(xiàn)的動畫用試著用代碼來生成释簿,畢竟有些時候我們是用代碼來控制動畫的。
代碼生成動畫
<font color=#FF4500 size=3>Animation公共類</font>
這里給大家發(fā)一個網(wǎng)站里面XML硼莽,類屬性都能查到庶溶,這個是Animation官方文檔
里面的方法比較多煮纵,但是重要的就如下幾個:
- <font color=#006400>android:duration</font> 對應代碼: setDuration(long) 動畫持續(xù)時間,以毫秒為單位
- <font color=#006400>android:fillAfter</font> 對應代碼: setFillAfter(boolean) 如果設置為true偏螺,控件動畫結(jié)束時行疏,將保持動畫最后時的狀態(tài)
- <font color=#006400>android:fillBefore</font> 對應代碼: setFillBefore(boolean) 如果設置為true,控件動畫結(jié)束時,還原到開始動畫前的狀態(tài)
- <font color=#006400>android:fillEnabled</font> 對應代碼: setFillEnabled(boolean) 與android:fillBefore 效果相同套像,都是在動畫結(jié)束時酿联,將控件還原到初始化狀態(tài)
- <font color=#006400>android:repeatCount</font> 對應代碼: setRepeatCount(int) 重復次數(shù)
- <font color=#006400>android:repeatMode</font> 對應代碼: setRepeatMode(int) 重復類型,有reverse和restart兩個值夺巩,取值為RESTART或 REVERSE贞让,必須與repeatCount一起使用才能看到效果。因為這里的意義是重復的類型柳譬,即回放時的動作喳张。
- <font color=#006400>android:interpolator</font> 對應代碼: setInterpolator(Interpolator) 設定插值器,其實就是指定的動作效果美澳,比如彈跳效果等
可以看到销部,在XML設置的屬性基本都可以用代碼來控制。從官方文檔中我們可以看到。它有5個子類洪规。正好對應之前我們在XML中學到的5中動畫的屬性靶草,如下:
XML | 實體類 |
---|---|
scale | ScaleAnimation |
alpha | AlphaAnimation |
rotate | RotateAnimation |
translate | TranslateAnimation |
set | AnimationSet |
<font color=#FF4500 size=3>AlphaAnimation</font>
<font color=#006400 >構(gòu)造函數(shù):</font>
- <font color=#006400 size=2>AlphaAnimation(Context context, AttributeSet attrs) 同樣,從本地XML加載動畫江咳,基本不用:</font>
- <font color=#006400 size=2>AlphaAnimation(float fromAlpha, float toAlpha)</font>
這里第二個構(gòu)造函數(shù)的參數(shù)為:
- android:fromAlpha 動畫開始的透明度,從0.0 --1.0 哥放,0.0表示全透明歼指,1.0表示完全不透明
- android:toAlpha 動畫結(jié)束時的透明度,也是從0.0 --1.0 甥雕,0.0表示全透明踩身,1.0表示完全不透明
那么我們就可以將前一篇中的XML用代碼來實現(xiàn)下:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:repeatCount="2"
android:repeatMode="reverse"
android:duration="3000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:toAlpha="0.5">
</alpha>
代碼:
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.5f);
alphaAnimation.setDuration(3000);
alphaAnimation.setRepeatCount(2);
alphaAnimation.setRepeatMode(Animation.REVERSE);
alphaAnimation.setFillAfter(true);
mTextView.setAnimation(alphaAnimation);
效果與之前是一樣的。由于繼承父類Animation所有有父類的共有屬性社露。下面其他幾種大同小異挟阻。
<font color=#FF4500 size=3>ScaleAnimation</font>
<font color=#006400 >構(gòu)造函數(shù):</font>
- <font color=#006400 size=2>ScaleAnimation(Context context, AttributeSet attrs) 從XML文件加載動畫,基本用不到</font>
- <font color=#006400 size=2>ScaleAnimation(float fromX, float toX, float fromY, float toY)</font>
- <font color=#006400 size=2>ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)</font>
- <font color=#006400 size=2>ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)</font>
參數(shù)對應XML含義如下:
- android:fromXScale 起始的X方向上相對自身的縮放比例峭弟,浮點值附鸽,比如1.0代表自身無變化,0.5代表起始時縮小一倍瞒瘸,2.0代表放大一倍坷备;
- android:toXScale 結(jié)尾的X方向上相對自身的縮放比例,浮點值情臭;
- android:fromYScale 起始的Y方向上相對自身的縮放比例省撑,浮點值赌蔑,
- android:toYScale 結(jié)尾的Y方向上相對自身的縮放比例,浮點值竟秫;
- android:pivotX 縮放起點X軸坐標娃惯,可以是數(shù)值、百分數(shù)肥败、百分數(shù)p 三種樣式趾浅,比如 50、50%馒稍、50%p
- android:pivotY 縮放起點Y軸坐標潮孽,取值及意義跟android:pivotX一樣。
這里與XML是一一對應的只是名字有一點點不同而已筷黔。需要注意的是這里的pivotYType的取值有三個往史,Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT分別對應數(shù)佛舱,百分數(shù)椎例,百分數(shù)p;下面我們來使用下:
XML:
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillBefore="true"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:repeatCount="1"
android:repeatMode="restart"
android:toXScale="1.5"
android:toYScale="1.5">
</scale>
代碼:
ScaleAnimation scaleAnimation = new ScaleAnimation(0f, 1.5f, 0, 1.5f,Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
scaleAnimation.setDuration(3000);
scaleAnimation.setFillBefore(true);
scaleAnimation.setRepeatCount(1);
scaleAnimation.setRepeatMode(Animation.RESTART);
mTextView.setAnimation(scaleAnimation);
<font color=#FF4500 size=3>RotateAnimation</font>
<font color=#006400 >構(gòu)造函數(shù):</font>
- <font color=#006400 size=2>RotateAnimation(Context context, AttributeSet attrs) 從XML文件加載動畫请祖,基本用不到</font>
- <font color=#006400 size=2> RotateAnimation(float fromDegrees, float toDegrees)</font>
- <font color=#006400 size=2>RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)</font>
- <font color=#006400 size=2>RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)</font>
參數(shù)對應XML含義如下:
- android:fromDegrees 開始旋轉(zhuǎn)的角度位置订歪,正值代表順時針方向度數(shù),負值代碼逆時針方向度數(shù)
- android:toDegrees 結(jié)束時旋轉(zhuǎn)到的角度位置肆捕,正值代表順時針方向度數(shù)刷晋,負值代碼逆時針方向度數(shù)
- android:pivotX 縮放起點X軸坐標,可以是數(shù)值慎陵、百分數(shù)眼虱、百分數(shù)p 三種樣式,比如 50席纽、50%捏悬、50%p
- android:pivotY 縮放起點Y軸坐標,可以是數(shù)值润梯、百分數(shù)过牙、百分數(shù)p 三種樣式,比如 50纺铭、50%寇钉、50%p
XML使用:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="-650"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true">
</rotate>
代碼:
RotateAnimation rotateAnim = new RotateAnimation(0, -650, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnim.setDuration(3000);
rotateAnim.setFillAfter(true);
mTextView.setAnimation(rotateAnim);
<font color=#FF4500 size=3>TranslateAnimation</font>
<font color=#006400 >構(gòu)造函數(shù):</font>
- <font color=#006400 size=2>RotateAnimation(Context context, AttributeSet attrs) 從XML文件加載動畫,基本用不到</font>
- <font color=#006400 size=2>TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)</font>
- <font color=#006400 size=2>TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)</font>
參數(shù)對應XML含義如下:
- android:fromXDelta 起始點X軸坐標舶赔,可以是數(shù)值扫倡、百分數(shù)、百分數(shù)p 三種樣式顿痪,比如 50镊辕、50%、50%p
- android:fromYDelta 起始點Y軸從標蚁袭,可以是數(shù)值征懈、百分數(shù)、百分數(shù)p 三種樣式揩悄;
- android:toXDelta 結(jié)束點X軸坐標
- android:toYDelta 結(jié)束點Y軸坐標
這里沒有什么難點就不再細述了卖哎。
XML使用:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="-80"
android:fromYDelta="0"
android:toYDelta="-80"
android:duration="2000"
android:fillBefore="true">
</translate>
代碼:
TranslateAnimation translateAnim = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -80,
Animation.ABSOLUTE, 0, Animation.ABSOLUTE, -80);
translateAnim.setDuration(2000);
translateAnim.setFillBefore(true);
mTextView.setAnimation(translateAnim);
<font color=#FF4500 size=3>AnimationSet</font>
AnimationSet類對應set標簽,定義動作類的集合删性。
<font color=#006400 >構(gòu)造函數(shù):</font>
- <font color=#006400 size=2>AnimationSet(boolean shareInterpolator) shareInterpolator取值true或false亏娜,取true時,指在AnimationSet中定義一個插值器(interpolater)蹬挺,它下面的所有動畫共同维贺。如果設為false,則表示它下面的動畫自己定義各自的插值器巴帮。</font>
增加動畫的函數(shù)為:(更多函數(shù)溯泣,請參看SDK文檔)
- <font color=#006400 size=2>public void addAnimation (Animation a)</font>
這里我們就將前面動畫的屬性加在一起:
setAnim = new AnimationSet(true);
setAnim.addAnimation(alphaAnimation);
setAnim.addAnimation(scaleAnimation);
setAnim.addAnimation(rotateAnim);
setAnim.setDuration(3000);
setAnim.setFillAfter(true);
mTextView.setAnimation(setAnim);
使用插值器:
ScaleAnimation interpolateScaleAnim=new ScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
interpolateScaleAnim.setInterpolator(new BounceInterpolator());
interpolateScaleAnim.setDuration(3000);
這里的插值器的種類與上篇一致,使用方法都是一樣的都是通過創(chuàng)建對象就可以了
其他插值器大家自己試驗下榕茧。 效果圖就不發(fā)了垃沦。
實戰(zhàn)
View動畫講到這基本上也就差不多了,那么我們用個小例子在實際中運用一下用押。
下面這個例子就是百籃應用中Activi ty進入與退出動畫肢簿。我們就可以用我們學到的View動畫來去實現(xiàn)。首先看下效果:
我們先來分析下這個動畫:
進入時->當前Activity向左退出 由完全可見變成完全不可見 即將進入的Activity反之 那么此時就是兩個動畫->從右進入蜻拨,從左退出
退出時->當前Activity向右退出 由完全可見變成完全不可見 即將進入的Activity反之 那么此時就是兩個動畫->從右退出池充,從左進入
那么就清楚了這里應該有四個動畫,每個動畫為組合動畫:平移與漸變
那么我們來看下XML代碼:
從左進入:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
從右進入:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p" android:toXDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
從左退出:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0%" android:toXDelta="-100%"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
從右退出:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0%p" android:toXDelta="100%"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
這里大家再看下就很清楚了缎讼。大家可能對于平移的參數(shù)有些模糊纵菌,這里我用一張圖:
從上圖可以看出,以手機屏幕下面邊未X軸休涤,屏幕左邊為Y軸咱圆,當Activity在X軸值為-100%p時,剛好在屏幕的左邊(位置1)功氨,當X軸值為0%p時序苏,剛好再屏幕內(nèi)(位置2),當X=100%p時剛好在屏幕右邊(位置3)捷凄。
在清楚了這點后我們看下代碼:
/**
* 設置進入 動畫
*/
@Override
public void startActivity(Intent intent) {
super.startActivity(intent);
overridePendingTransition(R.anim.anim_slide_in_right,R.anim.anim_slide_out_left);
}
/**
* 設置退出 動畫
*/
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.anim_slide_in_left,R.anim.anim_slide_out_right);
}
我們使用了這個方法:
<font color=#006400 size=2>public void overridePendingTransition(int enterAnim, int exitAnim)</font>
enterAnim 定義Activity進入屏幕時的動畫
exitAnim 定義Activity退出屏幕時的動畫
overridePendingTransition 方法必須在startActivity()或者 finish()方法的后面
最后效果:
是不是很簡單很酷炫忱详。嘿嘿!6宓印匈睁!如果想全局使用就要封裝在基類Activity中监透。
結(jié)語
下一篇我們一起來學習一下屬性動畫。 我們下篇見
感謝
站在巨人的肩膀上可以讓我們看的更遠航唆。
Android自定義控件三部曲文章