Android動(dòng)畫初探

安卓動(dòng)畫目前共分為三種動(dòng)畫逐幀動(dòng)畫、補(bǔ)間動(dòng)畫和屬性動(dòng)畫。

一绣夺、逐幀動(dòng)畫(frame-by-frame animation)

逐幀動(dòng)畫就是將一個(gè)完整的動(dòng)畫拆分成一張張單獨(dú)的圖片榨馁,然后再將它們連貫起來進(jìn)行播放薛耻,類似于動(dòng)畫片的工作原理输钩。

  • 素材圖片放到drawable文件夾下豺型,mipmap下無法引用
素材圖片
  • 在drawable文件夾下新建wifi-z的xml文件用來存放圖片
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    //oneshot表示是否循環(huán)播放 true只播放一次,false循環(huán)播放买乃,圖片順序不能變否則動(dòng)畫不連貫
    <item
    android:drawable="@drawable/icon_5"
    android:duration="300" />
    <item
    android:drawable="@drawable/icon_4"
    android:duration="300" />
    <item
    android:drawable="@drawable/icon_3"
    android:duration="300" />
    <item
    android:drawable="@drawable/icon_2"
    android:duration="300" />
    <item
    android:drawable="@drawable/icon_1"
    android:duration="300" />
    <item
    android:drawable="@drawable/icon_0"
    android:duration="300" />
    </animation-list>

  • Activity中引用動(dòng)畫
    // 存放動(dòng)畫圖片的imageview
    private ImageView mImg;
    // 開啟動(dòng)畫的按鈕
    private Button mBtn;
    // 實(shí)現(xiàn)逐幀動(dòng)畫的類
    private AnimationDrawable animationDrawable;

        mBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              mImg.setImageResource(R.drawable.wifi_d);
              animationDrawable = (AnimationDrawable) mImg.getDrawable();
              animationDrawable.start();//停止調(diào)用stop方法
          }
      });
    

二姻氨、補(bǔ)間動(dòng)畫(tweened animation)

補(bǔ)間動(dòng)畫則是可以對(duì)View進(jìn)行一系列的動(dòng)畫操作,包括淡入淡出剪验、縮放肴焊、平移、旋轉(zhuǎn)四種功戚。
<b>
補(bǔ)間動(dòng)畫只是表面上的View移動(dòng)娶眷,View實(shí)際還在原來位置,而屬性動(dòng)畫則是View也跟著移動(dòng)</b>

  • 淡入淡出
    AlphaAnimation:透明度(alpha)漸變效果啸臀,對(duì)應(yīng)<alpha/>標(biāo)簽届宠。
    外部xml方法
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="1.0"
    android:fillAfter="false"http://動(dòng)畫結(jié)束時(shí)是否保持在該位置
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"http://插值器
    android:toAlpha="0.1" />

      Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
      mImg.startAnimation(animation);
    

    java方式
    Animation alphaAnimation = new AlphaAnimation(1.0f, 0.1f);
    alphaAnimation.setDuration(2000);
    alphaAnimation.setFillAfter(false);
    mImg.startAnimation(alphaAnimation);

  • 縮放
    ScaleAnimation:縮放漸變,可以指定縮放的參考點(diǎn)乘粒,對(duì)應(yīng)<scale/>標(biāo)簽豌注。
    xml方式
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXScale="0.2"
    android:fromYScale="0.2"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%" //動(dòng)畫起始位置,相對(duì)于屏幕的百分比,兩個(gè)都為50%表示動(dòng)畫從自身中間開始
    android:toXScale="1.5"
    android:toYScale="1.5" />
    java方式
    Animation scaleAnimation = new ScaleAnimation(0.0f, 1.5f, 0.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    scaleAnimation.setDuration(2000);//設(shè)置動(dòng)畫持續(xù)時(shí)間為500毫
    scaleAnimation.setInterpolator(this, android.R.anim.accelerate_interpolator);//設(shè)置動(dòng)畫插入器
    mImg.startAnimation(scaleAnimation);

  • 平移
    TranslateAnimation:位移漸變灯萍,需要指定移動(dòng)點(diǎn)的開始和結(jié)束坐標(biāo)幌羞,對(duì)應(yīng)<translate/>標(biāo)簽。
    xml方式
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toXDelta="320"
    android:toYDelta="0" />
    java方式
    Animation translateAnimation = new TranslateAnimation(0, 320, 0, 0);
    translateAnimation.setDuration(2000);
    translateAnimation.setInterpolator(this, android.R.accelerate_decelerate_interpolator);//設(shè)置動(dòng)畫插入器
    mImg.startAnimation(translateAnimation);

  • 旋轉(zhuǎn)
    RotateAnimation:旋轉(zhuǎn)漸變竟稳,可以指定旋轉(zhuǎn)的參考點(diǎn)属桦,對(duì)應(yīng)<rotate/>標(biāo)簽。
    xml方式
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:repeatCount="-1"http://-1代表無限循環(huán) 正數(shù)代表循環(huán)幾次
    android:repeatMode="reverse"http://動(dòng)畫重復(fù)的模式他爸,reverse為反向聂宾,當(dāng)?shù)谂即螆?zhí)行時(shí),動(dòng)畫方向會(huì)相反诊笤。restart為重新執(zhí)行系谐,方向不變
    android:toDegrees="360" />
    java方式
    Animation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotateAnimation.setDuration(1000);
    rotateAnimation.setInterpolator(this, android.R.anim.accelerate_decelerate_interpolator);//設(shè)置動(dòng)畫插入器
    mImg.startAnimation(rotateAnimation);

  • 組合
    AnimationSet:組合漸變,支持組合多種漸變效果讨跟,對(duì)應(yīng)<set/>標(biāo)簽纪他。
    java方式
    AnimationSet animationSet = new AnimationSet(true);
    animationSet.addAnimation(alphaAnimation);
    animationSet.addAnimation(scaleAnimation);
    mImg.startAnimation(animationSet);

  • 動(dòng)畫監(jiān)聽器
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    //動(dòng)畫開始時(shí)調(diào)用 }
    @Override
    public void onAnimationEnd(Animation animation) {
    //動(dòng)畫結(jié)束時(shí)調(diào)用 }
    @Override
    public void onAnimationRepeat(Animation animation) {
    //動(dòng)畫重復(fù)時(shí)調(diào)用 } });

  • 插值器
    AccelerateInterpolator 加速,開始時(shí)慢中間加速
    DecelerateInterpolator 減速晾匠,開始時(shí)快然后減速
    AccelerateDecelerateInterolator 先加速后減速茶袒,開始結(jié)束時(shí)慢,中間加速
    AnticipateInterpolator 反向凉馆,先向相反方向改變一段再加速播放
    AnticipateOvershootInterpolator 反向加超越薪寓,先向相反方向改變亡资,再加速播放,會(huì)超出目的值然后緩慢移動(dòng)至目的值
    BounceInterpolator 跳躍向叉,快到目的值時(shí)值會(huì)跳躍锥腻,如目的值100,后面的值可能依次為85母谎,77瘦黑,70,80奇唤,90幸斥,100
    CycleIinterpolator 循環(huán),動(dòng)畫循環(huán)一定次數(shù)冻记,值的改變?yōu)橐徽液瘮?shù):Math.sin(2* mCycles* Math.PI* input)
    LinearInterpolator 線性,線性均勻改變
    OvershootInterpolator超越来惧,最后超出目的值然后緩慢改變到目的值

三冗栗、屬性動(dòng)畫(property animation)

功能很強(qiáng)大,可以替代逐幀動(dòng)畫與補(bǔ)間動(dòng)畫供搀。

  • ValueAnimator
    屬性動(dòng)畫的運(yùn)行機(jī)制是通過不斷地對(duì)值進(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í)長(zhǎng),那么ValueAnimator就會(huì)自動(dòng)幫我們完成從初始值平滑地過渡到結(jié)束值這樣的效果屿脐。

      //從0-1-5-1 float 類型 整型可以ofInt
      ValueAnimator animator = ValueAnimator.ofFloat(0f, 1.0f, 5.0f, 1.0f);
      animator.setDuration(300);
      animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator valueAnimator) {
              float value = (float) valueAnimator.getAnimatedValue();
              Log.d(TAG, "onAnimationUpdate: " + value);
          }
      });
      animator.start();
    
  • ObjectAnimator
    可以直接對(duì)任意對(duì)象的任意屬性進(jìn)行動(dòng)畫操作的涕蚤,比如說View的alpha屬性。
    // 旋轉(zhuǎn):rotation 漸變:alpha 平移:x軸tarnslationX(平移時(shí)需要先獲取當(dāng)前位置的诵,getTranslationX)
    //縮放 scaleX/scaleY
    ObjectAnimator animator = ObjectAnimator.ofFloat(mProperty, "alpha", 1.f, 0f);
    animator.setDuration(1000);
    animator.start();

  • AnimatorSet(組合動(dòng)畫)

  • after(Animator anim) 將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之后執(zhí)行

  • after(long delay) 將現(xiàn)有動(dòng)畫延遲指定毫秒后執(zhí)行

  • before(Animator anim) 將現(xiàn)有動(dòng)畫插入到傳入的動(dòng)畫之前執(zhí)行

  • with(Animator anim) 將現(xiàn)有動(dòng)畫和傳入的動(dòng)畫同時(shí)執(zhí)行
    ObjectAnimator translate = ObjectAnimator.ofFloat(mProperty, "translationX", -500f, 0f);
    ObjectAnimator rotation = ObjectAnimator.ofFloat(mProperty, "rotation", 0f, 360f);
    ObjectAnimator scale = ObjectAnimator.ofFloat(mProperty, "scaleX", 1.0f, 2.0f, 1.0f);
    AnimatorSet set = new AnimatorSet();
    set.play(rotation).with(scale).after(translate);
    set.setDuration(5000);
    set.start();

  • Animator監(jiān)聽器

  • 監(jiān)聽所有方法
    translate.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {

         }
    
         @Override
         public void onAnimationEnd(Animator animator) {
    
         }
    
         @Override
         public void onAnimationCancel(Animator animator) {
    
         }
    
         @Override
         public void onAnimationRepeat(Animator animator) {
    
         }
     });
    
  • 監(jiān)聽單個(gè)方法
    rotation.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
    super.onAnimationEnd(animation);
    }
    });

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末万栅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子西疤,更是在濱河造成了極大的恐慌烦粒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件代赁,死亡現(xiàn)場(chǎng)離奇詭異扰她,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芭碍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門徒役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窖壕,你說我怎么就攤上這事廉涕⌒涸疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狐蜕,是天一觀的道長(zhǎng)宠纯。 經(jīng)常有香客問我,道長(zhǎng)层释,這世上最難降的妖魔是什么婆瓜? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮贡羔,結(jié)果婚禮上廉白,老公的妹妹穿的比我還像新娘。我一直安慰自己乖寒,他們只是感情好猴蹂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楣嘁,像睡著了一般磅轻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逐虚,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天聋溜,我揣著相機(jī)與錄音,去河邊找鬼叭爱。 笑死撮躁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的买雾。 我是一名探鬼主播把曼,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼漓穿!你這毒婦竟也來了祝迂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤器净,失蹤者是張志新(化名)和其女友劉穎型雳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山害,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纠俭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浪慌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤荆。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖权纤,靈堂內(nèi)的尸體忽然破棺而出钓简,到底是詐尸還是另有隱情乌妒,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布外邓,位于F島的核電站撤蚊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏损话。R本人自食惡果不足惜侦啸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧枪。 院中可真熱鬧光涂,春花似錦、人聲如沸拧烦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋博。三九已至齐佳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間交播,已是汗流浹背重虑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工践付, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秦士,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓永高,卻偏偏與公主長(zhǎng)得像隧土,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子命爬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Animation Animation類是所有動(dòng)畫(scale曹傀、alpha、translate饲宛、rotate)的基...
    四月一號(hào)閱讀 1,921評(píng)論 0 10
  • 1 背景 不能只分析源碼呀皆愉,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí),剛好有人微博私信讓全面說說Android的動(dòng)畫艇抠,所以今...
    未聞椛洺閱讀 2,711評(píng)論 0 10
  • Android中動(dòng)畫分為三種: 逐幀動(dòng)畫 補(bǔ)間動(dòng)畫 屬性動(dòng)畫 逐幀動(dòng)畫 逐幀動(dòng)畫類似于gif或是電影的原理幕庐,通過將...
    fengmlo閱讀 716評(píng)論 0 2
  • 本文參加#未完待續(xù)异剥,就要表白#活動(dòng),本人承諾絮重,文章內(nèi)容為原創(chuàng)冤寿,且未在其他平臺(tái)發(fā)表過歹苦。 入我相思門,知我相思苦督怜, 長(zhǎng)...
    唇寒閱讀 303評(píng)論 1 5
  • 上次寫的文章里面提到了我的女兒殴瘦,有朋友驚呼「你竟然已經(jīng)有孩子了!」這時(shí)候我才想起來亮蛔,我經(jīng)常在網(wǎng)上交流的朋友們痴施,大都...
    c5de959d631b閱讀 928評(píng)論 8 6