android動(dòng)畫詳解(一)

Android動(dòng)畫詳解

Android動(dòng)畫主要分為兩類,傳統(tǒng)動(dòng)畫和Android3.0之后出現(xiàn)的屬性動(dòng)畫
傳統(tǒng)動(dòng)畫又包括幀動(dòng)畫補(bǔ)間動(dòng)畫

補(bǔ)間動(dòng)畫

補(bǔ)間動(dòng)畫又可以分為四種形式,分別是 alpha(淡入淡出)凉馆,translate(位移)音半,scale(縮放大小)跃须,rotate(旋轉(zhuǎn))
一般采用xml實(shí)現(xiàn)

XML實(shí)現(xiàn)

alpha_anim.xml動(dòng)畫實(shí)現(xiàn)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <!--透明度變換  -->
    <alpha
        android:duration="7000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

scale_anim.xml動(dòng)畫實(shí)現(xiàn)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <!--尺寸收縮-->

    <scale
        android:duration="7000"
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:pivotX="0%"
        android:pivotY="0%"
        android:toXScale="3.0"
        android:toYScale="3.0" />

</set>

rotate_anim.xml動(dòng)畫實(shí)現(xiàn)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">

    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="0%"
        android:pivotY="0%"
        android:toDegrees="+180" />

</set>

translate_anim.xml動(dòng)畫實(shí)現(xiàn)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">

    <!--位置轉(zhuǎn)移動(dòng)畫-->
    <translate
        android:duration="5000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="300"
        android:toYDelta="200" />

</set>

在代碼中可以通過

 Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotate_anim);
 ivBack.startAnimation(animation);

這樣的方式使用xml中的各種動(dòng)畫

純代碼實(shí)現(xiàn)

1.透明度動(dòng)畫

AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillAfter(true);
ivBack.startAnimation(alphaAnimation);

2.scale尺寸變換

ScaleAnimation scaleAnimation=new ScaleAnimation(0.0f,3.0f,0.0f,3.0f,150,500);
scaleAnimation.setDuration(4000);
scaleAnimation.setFillAfter(true);
ivBack.startAnimation(scaleAnimation);

3.translate位置變換

//xDelta 使用的是像素值
TranslateAnimation translateAnimation = new TranslateAnimation(0, 700, 0, 700);
translateAnimation.setDuration(4000);
ivBack.startAnimation(translateAnimation);

4.rotate角度變換

RotateAnimation rotateAnimation = new RotateAnimation(0, 180, 0, 0);
rotateAnimation.setDuration(5000);
rotateAnimation.setFillAfter(true);
ivBack.setAnimation(rotateAnimation);

我們給上述的圖像本身做了點(diǎn)擊事件

ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "點(diǎn)擊事件", Toast.LENGTH_LONG).show();
            }
        });

可以看到,角度變換或者尺寸位置變換都不會(huì)改變view本身的位置,點(diǎn)擊事件都對view的初始位置有效.

屬性動(dòng)畫

所有補(bǔ)間動(dòng)畫的內(nèi)容,都可以通過屬性動(dòng)畫實(shí)現(xiàn)。
屬性動(dòng)畫中比較重要的兩個(gè)類

ValueAnimator
屬性動(dòng)畫的運(yùn)行機(jī)制是通過不斷地對值進(jìn)行操作來實(shí)現(xiàn)的池摧,而初始值和結(jié)束值之間的動(dòng)畫過渡就是由ValueAnimator這個(gè)類來負(fù)責(zé)計(jì)算的。它的內(nèi)部使用一種時(shí)間循環(huán)的機(jī)制來計(jì)算值與值之間的動(dòng)畫過渡激况,我們只需要將初始值和結(jié)束值提供給ValueAnimator险绘,并且告訴它動(dòng)畫所需運(yùn)行的時(shí)長,那么ValueAnimator就會(huì)自動(dòng)幫我們完成從初始值平滑地過渡到結(jié)束值這樣的效果誉碴。

如果需要在1秒內(nèi)對0到1的數(shù)值進(jìn)行變換

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
valueAnimator.setDuration(1000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Log.i("進(jìn)度值", "進(jìn)度值" + animation.getAnimatedValue());
            }
        });
valueAnimator.start();

可以看到動(dòng)畫執(zhí)行過程中回調(diào)了很多參數(shù)

05-15 16:29:11.068 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.0
05-15 16:29:11.085 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.0
05-15 16:29:11.113 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.0026845932
05-15 16:29:11.132 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.0059125423
05-15 16:29:11.139 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.010709554
05-15 16:29:11.156 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.01690182
05-15 16:29:11.172 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.023988664
05-15 16:29:11.189 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.032835484
05-15 16:29:11.205 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.04237941
05-15 16:29:11.222 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.05378583
05-15 16:29:11.239 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.06646466
05-15 16:29:11.255 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.079527736
05-15 16:29:11.272 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.09457022
05-15 16:29:11.288 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.10978484
05-15 16:29:11.305 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.12702942
05-15 16:29:11.322 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.14533758
05-15 16:29:11.338 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.16349372
05-15 16:29:11.355 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.18371499
05-15 16:29:11.372 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.20357156
05-15 16:29:11.388 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.22548866
05-15 16:29:11.405 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.24818844
05-15 16:29:11.421 12018-12018/? I/進(jìn)度值: 進(jìn)度值0.27021015

ObjectAnimator
ObjectAnimator是ValueAnimator的子類宦棺,它提供了對view操作的多種基礎(chǔ)方法,如rotate,scale,translate,alpha。

XML實(shí)現(xiàn)

屬性動(dòng)畫的屬性值一般會(huì)牽扯到對象具體的屬性,更多是通過代碼動(dòng)態(tài)獲取,所以xml文件的實(shí)現(xiàn)會(huì)有點(diǎn)不方便黔帕。

android:ordering="together" 表明了當(dāng)前set集合的動(dòng)畫播放順序
together則表示同時(shí)并行加載
sequentially則表示順序執(zhí)行
對于多層動(dòng)畫播放順序的集合,可以使用set集合嵌套執(zhí)行

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">


    <objectAnimator
        android:duration="5000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType" />

    <objectAnimator
        android:duration="5000"
        android:propertyName="translationY"
        android:valueFrom="500"
        android:valueTo="0"
        android:valueType="floatType" />


    <objectAnimator
        android:duration="5000"
        android:propertyName="alpha"
        android:valueTo="0f" />


</set>

多set嵌套

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">


    <objectAnimator
        android:duration="5000"
        android:propertyName="translationX"
        android:valueFrom="-500"
        android:valueTo="0"
        android:valueType="floatType" />


    <set>
        <objectAnimator
            android:duration="5000"
            android:propertyName="translationY"
            android:valueFrom="500"
            android:valueTo="0"
            android:valueType="floatType" />


        <objectAnimator
            android:duration="5000"
            android:propertyName="alpha"
            android:valueFrom="0f"
            android:valueTo="1f" />
    </set>

    <set

        android:ordering="together">
        <objectAnimator
            android:duration="5000"
            android:propertyName="scaleX"
            android:valueFrom="0.5f"
            android:valueTo="1f"
            android:valueType="floatType" />


        <objectAnimator
            android:duration="5000"
            android:propertyName="scaleY"
            android:valueFrom="0"
            android:valueTo="0.5f"
            android:valueType="floatType" />
    </set>


</set>

代碼使用該動(dòng)畫集合

AnimatorSet set= (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this,R.animator.object_anim);
set.setTarget(ivBack);
set.start();

代碼實(shí)現(xiàn)屬性動(dòng)畫

旋轉(zhuǎn)動(dòng)畫

ObjectAnimator rotation = ObjectAnimator.ofFloat(ivBack, "rotation",0,90, 0f, 180f);
rotation.setDuration(2000);
rotation.start();

透明度變換

ObjectAnimator anim = ObjectAnimator.ofFloat(ivBack, "alpha", 1.0f, 0.8f, 0.6f, 0.4f, 0.2f, 0.0f);
anim.setRepeatCount(-1);
anim.setRepeatMode(ObjectAnimator.REVERSE);
anim.setDuration(2000);
anim.start();

anim.setRepeatCount(-1);設(shè)置動(dòng)畫的循環(huán)次數(shù), ValueAnimator.INFINITE即無限循環(huán)
android:repeatMode
重復(fù)模式代咸,前提是android:repeatCount為-1
它有兩種值:”reverse”和”repeat”,第一個(gè)表示反向重復(fù)成黄,第二個(gè)為順序重復(fù)呐芥。

用組合實(shí)現(xiàn)動(dòng)畫效果也是可以的

ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(ivBack, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(ivBack, "scaleX", 0.0f, 1.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(ivBack, "scaleY", 0.0f, 3.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(ivBack, "rotation", 0, 150);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(ivBack, "translationX", 100, 390);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(ivBack, "translationY", 100, 380);
AnimatorSet set = new AnimatorSet();
set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
// set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
set.setDuration(3000);
set.start();

注:為了區(qū)分Property animation和View animation的資源文件,從Android 3.1(api 12)開始奋岁,Property animation的xml文件存在res/animator/目錄下(View animation的存在res/anim/目錄下)思瘟, animator這個(gè)名是可選的。但是如果你想要使用Eclipse ADT plugin (ADT 11.0.0+)的布局編輯器闻伶,你就必須使用res/animator/目錄滨攻,因?yàn)锳DT只在該目錄下尋找property animation的資源文件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市光绕,隨后出現(xiàn)的幾起案子女嘲,更是在濱河造成了極大的恐慌,老刑警劉巖诞帐,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欣尼,死亡現(xiàn)場離奇詭異,居然都是意外死亡停蕉,警方通過查閱死者的電腦和手機(jī)愕鼓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慧起,“玉大人拒啰,你說我怎么就攤上這事⊥昊郏” “怎么了谋旦?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屈尼。 經(jīng)常有香客問我册着,道長,這世上最難降的妖魔是什么脾歧? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任甲捏,我火速辦了婚禮,結(jié)果婚禮上鞭执,老公的妹妹穿的比我還像新娘司顿。我一直安慰自己,他們只是感情好兄纺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布大溜。 她就那樣靜靜地躺著,像睡著了一般估脆。 火紅的嫁衣襯著肌膚如雪钦奋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天疙赠,我揣著相機(jī)與錄音付材,去河邊找鬼。 笑死圃阳,一個(gè)胖子當(dāng)著我的面吹牛厌衔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捍岳,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼富寿,長吁一口氣:“原來是場噩夢啊……” “哼睬隶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起作喘,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晕城,沒想到半個(gè)月后泞坦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖顷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年贰锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滤蝠。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌熄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出物咳,到底是詐尸還是另有隱情锣险,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布览闰,位于F島的核電站芯肤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏压鉴。R本人自食惡果不足惜崖咨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望油吭。 院中可真熱鬧击蹲,春花似錦、人聲如沸婉宰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心包。三九已至世曾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谴咸,已是汗流浹背轮听。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岭佳,地道東北人血巍。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像珊随,于是被迫代替她去往敵國和親述寡。 傳聞我的和親對象是個(gè)殘疾皇子柿隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 1 背景 不能只分析源碼呀,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí)鲫凶,剛好有人微博私信讓全面說說Android的動(dòng)畫禀崖,所以今...
    未聞椛洺閱讀 2,716評(píng)論 0 10
  • 【Android 動(dòng)畫】 動(dòng)畫分類補(bǔ)間動(dòng)畫(Tween動(dòng)畫)幀動(dòng)畫(Frame 動(dòng)畫)屬性動(dòng)畫(Property ...
    Rtia閱讀 6,178評(píng)論 1 38
  • 一般常用的android動(dòng)畫有View Animation(視圖動(dòng)畫)和Property Animation(屬性...
    JCJIE閱讀 427評(píng)論 0 2
  • 轉(zhuǎn)載一篇高質(zhì)量博文,原地址請戳這里轉(zhuǎn)載下來方便今后查看螟炫。1 背景不能只分析源碼呀波附,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí),...
    Elder閱讀 1,943評(píng)論 0 24
  • Animation Animation類是所有動(dòng)畫(scale昼钻、alpha掸屡、translate、rotate)的基...
    四月一號(hào)閱讀 1,923評(píng)論 0 10