真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android中動畫的實現(xiàn)原理實例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹“Android中動畫的實現(xiàn)原理實例分析”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“Android中動畫的實現(xiàn)原理實例分析”文章能幫助大家解決問題。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、小程序定制開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運(yùn)作于一體。

Android動畫分類


在Android中我們一般將動畫分為兩類,一類是View Animation(視圖動畫),一類是Property Animation,當(dāng)然也有說分為三種,F(xiàn)rame Animation,Tween Animation,和Property Animation,由于前兩種一般都是作用于整個View的,所以就統(tǒng)稱為View Animation。在谷歌官方文檔中也是按兩種分類來講解的。

在Android 5.0開始增加了Material Design ,Material Design 中實現(xiàn)了一些動畫為用戶提供操作反饋并在用戶與您的應(yīng)用進(jìn)行互動時提供視覺連續(xù)性。 它將為按鈕與操作行為轉(zhuǎn)換提供一些默認(rèn)動畫,我們可以定制觸摸反饋,使用揭露效果,定制操作行為轉(zhuǎn)換,指定定制轉(zhuǎn)換,使用轉(zhuǎn)換啟動一個操作行為,以共享元素啟動一個操作行為等等。

Frame Animation

由于Frame Animation,Tween Animation的實現(xiàn)還是有區(qū)別的,暫且就將這兩種方式實現(xiàn)分開介紹,F(xiàn)rame Animation其實就是將一系列的圖片一張一張的展示出來,這個和我們看電影是類似的,由于人眼有一個可接收的暫留時間,這也就是為什么人在線看視頻會感覺卡頓。當(dāng)然我們實現(xiàn)Frame Animation就是這個依據(jù),當(dāng)播放相同的圖片張數(shù)用時越短也就越流暢,自然人就會感覺是一個動畫。我們常見的Gif其實也是幀動畫,如果你用PhotoShop打開Gif動畫,會發(fā)現(xiàn)里面是有很多圖層的也就是很多幀。

對于Frame動畫有兩種實現(xiàn)方式,第一種方式就是在drawable文件夾下創(chuàng)建一個xml文件。它的語法很簡單,如下



  

看了上面你會發(fā)現(xiàn)實現(xiàn)Frame動畫很簡單,屬性很少,animation-list 是動畫的根元素,在根元素中的oneshot屬性表示動畫執(zhí)行次數(shù),如果設(shè)置為true表示只播放一次,如果false則表示會一直循環(huán)執(zhí)行。在根元素下有item元素,該元素就是我們要添加的圖片,每一個item表示一幀,item下的drawable就是我們的圖片資源,duration就是該幀動畫執(zhí)行的時間。例如



  
  
  
  
  
  
  
  

使用方法如下

//可以在xml中設(shè)置background  
   imageView.setBackgroundResource(R.drawable.frame_run_animation);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();

Android中動畫的實現(xiàn)原理實例分析

運(yùn)行效果圖如上,在上面我們沒有添加oneshot屬性,則該屬性默認(rèn)false,也就是說該動畫會一直循環(huán)執(zhí)行,當(dāng)我們設(shè)置true后則播放到最后一幀時動畫停止,當(dāng)我們想停止時可以使用AnimationDrawable 的stop方法,它還提供了isRunning()方法判斷是否已經(jīng)在執(zhí)行動畫。另外我們還需要注意的是小心OOM。

當(dāng)然用代碼實現(xiàn)也很簡單,如下

private void addFrame() {
    AnimationDrawable animationDrawable = new AnimationDrawable();
    int[] mipmaps = new int[]{R.mipmap.run1, R.mipmap.run2, R.mipmap.run3,
        R.mipmap.run4, R.mipmap.run5, R.mipmap.run6, R.mipmap.run7, R.mipmap.run8,};
    for (int i = 1; i <= 8; i++) {
      int id=mipmaps[i-1];
      //或者使用下面方式,注意如果圖片資源放在drawable下時將mipmap修改下
      //int id = getResources().getIdentifier("run" + i, "mipmap", getPackageName());
      Drawable drawable = getResources().getDrawable(id);
      animationDrawable.addFrame(drawable, 200);
    }
    animationDrawable.setOneShot(false);
    imageView.setBackgroundDrawable(animationDrawable);
    animationDrawable.start();
  }

Tween Animation

Tween Animation即補(bǔ)間動畫,主要分為四種,分別是平移、縮放、旋轉(zhuǎn)、透明度,直接上語法



  
  
  
  
  
    ...
  

這是官方給的語法,set 是一個動畫集合,內(nèi)部可以是多個動畫的組合,也可以嵌套set,這里包含了動畫實現(xiàn)的所有屬性。在上面的語法中我們需要注意的是平移的時候其實位置接受百分比數(shù)值:從-100到100的值,以“%”結(jié)尾,表示百分比相對于自身;從-100到100的值,以“%p”結(jié)尾,表示百分比相對于父容器。例如平移開始位置在自身中間則是50%,如平時開始位置在父容器的則是50%p.

例如有些人給我們的Activity會加一些從左邊進(jìn)右邊出的動畫,那么當(dāng)我們打開Activity時將Activity布局的fromXDelta值-100%p并將toXDelta為0%p,那么我們看到的效果就是從左邊進(jìn)入了。

插值器

在動畫插值器起的作用主要是改變動畫的執(zhí)行速率,一般情況我們不需要自己實現(xiàn)插值器,因為在Android中已經(jīng)給我們提供了9種插值器,應(yīng)該夠我們使用了,我們使用插值器后會讓動畫執(zhí)行的效果更酷炫,當(dāng)然想自定義插值器也不難,可以查看已經(jīng)實現(xiàn)插值器源碼做參考。

accelerate_decelerate_interpolator:先加速后減速accelerate_interpolator:一直加速anticipate_interpolator: 開始的時候先向后甩一點(diǎn)然后向前,就好比人扔?xùn)|西會先向后甩一下,這樣才能拋的遠(yuǎn)anticipate_overshoot_interpolator:和上一種插值器相似,先向后拋然后向前,到達(dá)終點(diǎn)后會有回彈一下效果,好比我們將球拋到墻上,然后反彈回來bounce_interpolator:動畫結(jié)束的時候彈起,類似皮球落地,會彈幾下才停止cycle_interpolator:動畫循環(huán)播放特定的次數(shù)回到原點(diǎn),速率改變沿著正弦曲線decelerate_interpolator:減速的插值器,剛開始速度快,然后越來越慢直到停止linear_interpolator:線性的插值器。從開始到結(jié)束勻速運(yùn)動overshoot_interpolator:向前超過設(shè)定值一點(diǎn)然后返回

下面簡單實現(xiàn)一個動畫,動畫效果如下面截圖,是一個透明度,平移,縮放的動畫同時執(zhí)行的動畫。

Android中動畫的實現(xiàn)原理實例分析



  
  
  

然后使用下面代碼給ImageView加入動畫。

Animation animation= AnimationUtils.loadAnimation(this,R.anim.anim_in_left_top);
 imageView.startAnimation(animation);

當(dāng)然我們也可給動畫加上監(jiān)聽。如

animation.setAnimationListener(new Animation.AnimationListener() {
          @Override
          public void onAnimationStart(Animation animation) {
          }
          @Override
          public void onAnimationEnd(Animation animation) {
          }
          @Override
          public void onAnimationRepeat(Animation animation) {
          }
        });

上面的監(jiān)聽分別是動畫開始結(jié)束和更新時候的回調(diào)。我們在回調(diào)中做一些額外的操作。在代碼中實現(xiàn)動畫就不在細(xì)說,主要對應(yīng)AnimationSet, TranslateAnimation,ScaleAnimation,AlphaAnimation,RotateAnimation。

Propterty Animation

屬性動畫是3.0之后引入的,在View動畫中雖然我們看到了我們的控件位置發(fā)生發(fā)生變化,比如Button雖然位置變化了,但是點(diǎn)擊響應(yīng)區(qū)域還在原來的位置。而屬性動畫就可以解決這種問題。它可以作用于View的屬性。
語法


  
  

  
    ...
  

下面列出了常見的屬性名字,另外需要注意的是,使用屬性動畫時,必須有相應(yīng)屬性的set/get方法,否則屬性動畫沒有效果的。

translationX 和 translationY : 控制View距離左邊和頂部的距離的增加值。是一個相對值。相對于自身位置的具體。

rotation 、 rotationX 和 rotationY : rotation 是控制View圍繞其支點(diǎn)進(jìn)行旋轉(zhuǎn)。 rotationX 和 rotationY 分別是圍繞X軸和Y軸旋轉(zhuǎn)。

scaleX 和 scaleY : 控制View的縮放。

pivotX 和 pivotY : 控制View的支點(diǎn)位置,進(jìn)行旋轉(zhuǎn)和縮放,默認(rèn)是View的中點(diǎn)。它們都是 float 值, 0 表示View的最左邊和最頂端, 1 表示最右端和最下端。

alpha : 控制View的透明度。

x 和 y : 控制View在布局容器中距離左邊和頂部的距離。是一個絕對值。

例如我們實現(xiàn)一個旋轉(zhuǎn)加透明度變化的動畫,效果圖如下


Android中動畫的實現(xiàn)原理實例分析



  
  

然后

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(this,
        R.animator.property_animator);
set.setTarget(imageView);
set.start();

當(dāng)然不用xml書寫也是很簡單的,如下代碼

ObjectAnimator.ofFloat(imageView,"rotation",0,180,90,180)
.setDuration(2000).start();

代碼實現(xiàn)的效果就是在2秒內(nèi)先旋轉(zhuǎn)到180度,在回到90度在轉(zhuǎn)回180度
效果圖如

Android中動畫的實現(xiàn)原理實例分析

在上面代碼實現(xiàn)了一直屬性動畫,那么如果我們想同時作用幾個屬性那該如何操作呢。此時我們有兩種實現(xiàn)方式分別是類PropertyValuesHolder和AnimatorSet,話不多說,先上圖再直接上代碼。

Android中動畫的實現(xiàn)原理實例分析

private void startPropertyAnimation3(){
    PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", -200,-100,100, 200,300);
    PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 2.0f);
    PropertyValuesHolder rotate = PropertyValuesHolder.ofFloat("rotation", 0f, 360f);
    PropertyValuesHolder rotationY = PropertyValuesHolder.ofFloat("rotationX", 0f, 180f);
    ObjectAnimator together = ObjectAnimator.ofPropertyValuesHolder(imageView, translationX,rotate, scaleX, rotationY);
    together.setDuration(3000);
    together.start();
  }
//或者使用AnimatorSet,此方法使用的是按順序播放。
  private void startPropertyAnimation4(){
    ObjectAnimator translationX = ObjectAnimator.ofFloat(imageView, "translationX", -200,-100,100, 200,300);
    ObjectAnimator scaleX = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 2.0f).setDuration(1000);
    ObjectAnimator rotation = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).setDuration(1000);
    ObjectAnimator rotationX=ObjectAnimator.ofFloat(imageView,"rotationX", 0f, 180f).setDuration(1000);
    AnimatorSet set = new AnimatorSet();
    set.playSequentially(translationX, scaleX, rotation,rotationX);
    set.setDuration(4000);
    set.start();
  }

Fragment/Activity動畫

其實實現(xiàn)Activity及Fragment切換動畫也是很簡單的,具體的動畫效果制作可以使用即使上面介紹的補(bǔ)間動畫。例如我們Fragment動畫。

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.fragment_container, fragment, fragmentTag);
transaction.commit();

Activity實現(xiàn)動畫也很簡單,在Activity中提供了overridePendingTransition(int enterAnim, int exitAnim) 方法,該方法接收兩個參數(shù),第一個參數(shù)是Activity進(jìn)入時的動畫,第二個參數(shù)是Activity退出時的動畫。該方法一般寫在startActivity()后和finish()后,如果我們想打開或者退出不顯示動畫,可將參數(shù)設(shè)置為0。

在上面的我們介紹了Activity/Fragment在代碼中實現(xiàn)動畫的方法,當(dāng)然還有一種簡單的實現(xiàn)方式,那就是在主題中設(shè)置動畫。
對于Activity


    @style/AnimationStyle
  
  
    @anim/slide_in_left
    @anim/slide_out_right
    @anim/slide_in_left
    @anim/slide_out_right
  

可能你不太理解為什么是設(shè)置了四種,假如有Activity1和Activity2。當(dāng)我們在Activity1中跳轉(zhuǎn)到Activity2時,Activity1在頁面上消失是執(zhí)行的:activityOpenExitAnimation動畫,Activity2出現(xiàn)在屏幕上執(zhí)行的動畫是activityOpenEnterAnimation。當(dāng)Activity2 finish返回Activity1時,Activity2執(zhí)行的動畫是activityCloseExitAnimation,Activity1顯示在屏幕執(zhí)行的是activityCloseEnterAnimation。創(chuàng)建上面主題后我們需要將該主題應(yīng)用到我們的Activty中就可以了。

同理Fragment也可相應(yīng)設(shè)置,如activityCloseEnterAnimation改為fragmentCloseEnterAnimation即可。


除此之外我們也可以使用windowAnimation,它包括 windowEnterAnimation 和 windowExitAnimation。注意的一點(diǎn)就是WindowAnimation的控制權(quán)大于Activity/Fragment Animation的控制權(quán)。

關(guān)于“Android中動畫的實現(xiàn)原理實例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。


本文題目:Android中動畫的實現(xiàn)原理實例分析-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://weahome.cn/article/ipgdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部