自定義View(二)-動畫- 代碼生成View動畫

前言

上篇我們介紹了視圖動畫肠缔,說的確切點應該是視圖動畫中的補間動畫(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)。首先看下效果:

anim.gif

我們先來分析下這個動畫:
進入時->當前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ù)有些模糊纵菌,這里我用一張圖:

圖片.png

從上圖可以看出,以手機屏幕下面邊未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()方法的后面
最后效果:

animAc.gif

是不是很簡單很酷炫忱详。嘿嘿!6宓印匈睁!如果想全局使用就要封裝在基類Activity中监透。


結(jié)語

下一篇我們一起來學習一下屬性動畫。 我們下篇見

感謝

站在巨人的肩膀上可以讓我們看的更遠航唆。
Android自定義控件三部曲文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胀蛮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子糯钙,更是在濱河造成了極大的恐慌粪狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件任岸,死亡現(xiàn)場離奇詭異再榄,居然都是意外死亡,警方通過查閱死者的電腦和手機享潜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門困鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剑按,你說我怎么就攤上這事窝革。” “怎么了吕座?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵虐译,是天一觀的道長。 經(jīng)常有香客問我吴趴,道長漆诽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任锣枝,我火速辦了婚禮厢拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撇叁。我一直安慰自己供鸠,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布陨闹。 她就那樣靜靜地躺著楞捂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趋厉。 梳的紋絲不亂的頭發(fā)上寨闹,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音君账,去河邊找鬼繁堡。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的椭蹄。 我是一名探鬼主播闻牡,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绳矩!你這毒婦竟也來了罩润?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤埋酬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烧栋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體写妥,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年审姓,在試婚紗的時候發(fā)現(xiàn)自己被綠了珍特。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魔吐,死狀恐怖扎筒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酬姆,我是刑警寧澤嗜桌,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站辞色,受9級特大地震影響骨宠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜相满,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一层亿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧立美,春花似錦匿又、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洞慎,卻和暖如春针贬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拢蛋。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工桦他, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓快压,卻偏偏與公主長得像圆仔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔫劣,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容