Android 彈性動(dòng)畫三種實(shí)現(xiàn)方式

**原文地址:http://blog.csdn.net/qq_34902522/article/details/77651799

前言###

現(xiàn)在的android開發(fā)提出的需求是越來越接近現(xiàn)實(shí)真實(shí)感抽活,提高用戶  
體驗(yàn)感摊溶。就拿動(dòng)畫效果來說馁筐,之前設(shè)計(jì)給的需求大都比較直接妻往,縮放、  
旋轉(zhuǎn)雇锡、移動(dòng)等動(dòng)畫效果都執(zhí)行完就結(jié)束了◎窍樱現(xiàn)在的話渠概,為了追求現(xiàn)實(shí)  
生活中的那種真實(shí)感,往往都會(huì)有一個(gè)回彈的效果舶替,稱之為彈性動(dòng)畫令境。

非彈性動(dòng)畫體驗(yàn)###

非彈性動(dòng)畫的效果圖:  
普通縮放動(dòng)畫效果

我們來看一下實(shí)現(xiàn)該效果的代碼:

private void onScaleAnimation(){
        ObjectAnimator animatorX = ObjectAnimator.ofFloat(imageView,"scaleX",1.0f,1.8f);
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(imageView,"scaleY",1.0f,1.8f);
        AnimatorSet set =new AnimatorSet();
        set.setDuration(1000);
        set.playTogether(animatorX,animatorY);
        set.start();
    }
通過效果圖,我們會(huì)覺得不real顾瞪,我們想讓他Q一點(diǎn)展父,有彈性效果  
那該怎么實(shí)現(xiàn)呢?往下看玲昧。

彈性動(dòng)畫的三種實(shí)現(xiàn)方式###

way 1####

通過interpolator(差值器)實(shí)現(xiàn)彈性效果栖茉。  
這里給大家安利一個(gè)關(guān)于差值器網(wǎng)站:

選擇你所需要的差值器

在這個(gè)網(wǎng)站上可以在線看每種interpolator的效果,從而選擇  
所需要的interpolator孵延。這里我們選擇scaling,library選  
擇spring吕漂。如下圖:
這里寫圖片描述
然后重寫interpolator類,代碼如下:  
public class SpringScaleInterpolator implements Interpolator {
    //彈性因數(shù)
    private float factor;

    public SpringScaleInterpolator(float factor) {
        this.factor = factor;
    }

    @Override
    public float getInterpolation(float input) {

        return (float) (Math.pow(2, -10 * input) * Math.sin((input - factor / 4) * (2 * Math.PI) / factor) + 1);
    }


}
接下來就是把我們重寫的差值器設(shè)置進(jìn)去尘应,看代碼:  
private void onScaleAnimationBySpringWayOne(){
//        ScaleAnimation animation =new ScaleAnimation(1.0f,1.8f,1.0f,1.8f);
//        animation.setDuration(1000);
//        animation.setInterpolator(new SpringScaleInterpolator(0.4f));
//        imageView.startAnimation(animation);
        ObjectAnimator animatorX = ObjectAnimator.ofFloat(imageView,"scaleX",1.0f,1.8f);
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(imageView,"scaleY",1.0f,1.8f);
        AnimatorSet set =new AnimatorSet();
        set.setDuration(1000);
        set.setInterpolator(new SpringScaleInterpolator(0.4f));
        set.playTogether(animatorX,animatorY);
        set.start();

    }
這里重寫的interpolator的構(gòu)造方法中我穿的參數(shù)是因子惶凝,  
它的值越大吼虎,它回彈效果越慢。讓我們來看看效果吧苍鲜。
重寫interpolator實(shí)現(xiàn)的回彈效果
確實(shí)達(dá)到了我們要的彈性效果思灰,如果覺得彈性不夠的話,可以修改  
彈性因數(shù)即可混滔。這里我用的是屬性動(dòng)畫洒疚,用補(bǔ)間動(dòng)畫設(shè)置自己  
重寫的interpolator也是同樣可以的。

way 2####

第二種實(shí)現(xiàn)彈性動(dòng)畫的方式是使用Facebook推出的rebound  
如何使用的呢坯屿?首先我們要在build.gradle中引入如下依賴:  
compile 'com.facebook.rebound:rebound:0.3.8'  
然后我們先上代碼油湖,根據(jù)代碼來講解使用:  
private void onScaleAnimationBySpringWayTwo(){
        SpringSystem springSystem = SpringSystem.create();
        Spring spring = springSystem.createSpring();
        spring.setCurrentValue(1.0f);
        spring.setSpringConfig(new SpringConfig(50,5));
        spring.addListener(new SimpleSpringListener(){
            @Override
            public void onSpringUpdate(Spring spring) {
                super.onSpringUpdate(spring);
                float currentValue = (float) spring.getCurrentValue();
                imageView.setScaleX(currentValue);
                imageView.setScaleY(currentValue);
            }
        });
        spring.setEndValue(1.8f);
    }
使用rebound我們需要初始化SpringSystem對象和Spring對象。  
通過Spring我們可以設(shè)置動(dòng)畫屬性的初始值领跛、結(jié)束值乏德。  
Spring需要添加一個(gè)SpringListener接口,代碼中我用的SimpleSpringListener  
是Springlistener的實(shí)現(xiàn)類吠昭。(ps:addListener這里如果new 一個(gè)SpringListener的話  
要重寫全部的方法喊括,沒必要,需要哪個(gè)寫哪個(gè))矢棚。  
我們看下SpringListener接口的定義  
public interface SpringListener {

  /**
   * called whenever the spring is updated
   * @param spring the Spring sending the update
   */
  void onSpringUpdate(Spring spring);

  /**
   * called whenever the spring achieves a resting state
   * @param spring the spring that's now resting
   */
  void onSpringAtRest(Spring spring);

  /**
   * called whenever the spring leaves its resting state
   * @param spring the spring that has left its resting state
   */
  void onSpringActivate(Spring spring);

  /**
   * called whenever the spring notifies of displacement state changes
   * @param spring the spring whose end state has changed
   */
  void onSpringEndStateChange(Spring spring);
}
我們需要什么樣的需求就重寫對應(yīng)方法就好瘾晃。
上面的代碼中有SpringConfig這個(gè)對象,通過看源碼發(fā)現(xiàn)  
他的構(gòu)造函數(shù)接受兩個(gè)變量:1.tension(拉力)幻妓、2.friction(摩擦力)蹦误。  
作用是什么呢?很好理解tension拉力越大肉津,彈性越大强胰,friction  
摩擦力越大,彈性效果越小妹沙。默認(rèn)的tension值偶洋,friction值如下:  
  public static SpringConfig defaultConfig = SpringConfig.fromOrigamiTensionAndFriction(40, 7);

下面讓我們看下通過rebound實(shí)現(xiàn)的彈性效果是什么樣的.
通過rebound實(shí)現(xiàn)彈性動(dòng)畫
彈性效果可以通過修改tension和friction的值來改變,大家可以試試距糖。

way 3####

下面我們說一說最后一種實(shí)現(xiàn)方式玄窝。通過引入官方提供的SpringAnimation  
來實(shí)現(xiàn)。上面第二種方式我們是用的Facebook推出的框架悍引,現(xiàn)在  
我們看看Google官方的效果吧恩脂。  
首先我們在build.gradle文件中引入依賴:  
compile 'com.android.support:support-dynamic-animation:25.3.1'
接下來上代碼:
private void onScaleAnimationBySpringWayThree(){
        SpringAnimation animationX = new SpringAnimation(imageView, SpringAnimation.SCALE_X,1.8f);
        SpringAnimation animationY = new SpringAnimation(imageView, SpringAnimation.SCALE_Y,1.8f);
        animationX.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
        animationX.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY);
        animationX.setStartValue(1.0f);

        animationY.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
        animationY.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY);
        animationY.setStartValue(1.0f);

        animationX.start();
        animationY.start();
    }
這里面具體的一些用法,我就不細(xì)說了趣斤,可以參考:

SpringAnimation的使用

這個(gè)鏈接里面說的還挺詳細(xì)的俩块。那我們看下通過SpringAnimation  
實(shí)現(xiàn)的效果是怎么樣的。
彈性動(dòng)畫實(shí)現(xiàn)通過SpringAnimation
同rebound,這邊如果你對彈性動(dòng)畫的彈性效果不滿意可以通過  
setStiffness()和setDampingRatio()方法來實(shí)現(xiàn)你想要的效果玉凯。  
注意哦势腮,stiffness的值越小,彈性效果越好漫仆,彈時(shí)間越長捎拯。  
DampingRatio的值越大,彈性效果越差盲厌。

區(qū)別###

這三種方式都可以實(shí)現(xiàn)彈性效果署照,那到底選擇什么方式呢,這里說一下  
rebound和SpringAnimation狸眼。SpringAnimation的話在對一個(gè)控件  
多個(gè)屬性的動(dòng)畫效果設(shè)置比如一個(gè)view我既設(shè)置縮放動(dòng)畫又設(shè)置  
平移動(dòng)畫藤树。就會(huì)會(huì)出現(xiàn)代碼量多的問題浴滴,而rebound則相對好些拓萌。  
下面附上一張完整的效果圖:
這里寫圖片描述
最后附上項(xiàng)目的demo,有需要的可以看看升略。  

彈性動(dòng)畫demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末微王,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子品嚣,更是在濱河造成了極大的恐慌炕倘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翰撑,死亡現(xiàn)場離奇詭異罩旋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眶诈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涨醋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逝撬,你說我怎么就攤上這事浴骂。” “怎么了宪潮?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵溯警,是天一觀的道長。 經(jīng)常有香客問我狡相,道長梯轻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任尽棕,我火速辦了婚禮檩淋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己蟀悦,他們只是感情好媚朦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著日戈,像睡著了一般询张。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浙炼,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天份氧,我揣著相機(jī)與錄音,去河邊找鬼弯屈。 笑死蜗帜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的资厉。 我是一名探鬼主播厅缺,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宴偿!你這毒婦竟也來了湘捎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窄刘,失蹤者是張志新(化名)和其女友劉穎窥妇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娩践,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡活翩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翻伺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片材泄。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖穆趴,靈堂內(nèi)的尸體忽然破棺而出脸爱,到底是詐尸還是另有隱情,我是刑警寧澤未妹,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布簿废,位于F島的核電站,受9級特大地震影響络它,放射性物質(zhì)發(fā)生泄漏族檬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一化戳、第九天 我趴在偏房一處隱蔽的房頂上張望单料。 院中可真熱鬧埋凯,春花似錦、人聲如沸扫尖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽换怖。三九已至甩恼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沉颂,已是汗流浹背条摸。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铸屉,地道東北人钉蒲。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像彻坛,于是被迫代替她去往敵國和親顷啼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 本文參加#感悟三下鄉(xiāng),青春筑夢行#活動(dòng)瘾婿,本人承諾蜻牢,文章內(nèi)容為原創(chuàng),且未在其他平臺(tái)發(fā)表過偏陪。 明明都是一些小...
    01620a5339cc閱讀 359評論 1 5
  • 錢是什么抢呆?是流動(dòng)的水。誰能把水留椎亚抱虐?放在地上,它流走了饥脑;放在容器里恳邀,會(huì)干涸;即使喝到肚子里灶轰,它還會(huì)溜走谣沸。既然留它不...
    duoduo_four閱讀 166評論 0 1
  • 天氣變得超級冷乳附,我早就穿上了打底褲,不是厚的所以感覺超級冷。上海這會(huì)還在下著雨赋除,八號就要立冬了阱缓,感覺要有好多衣服要...
    一顆小雞蛋閱讀 228評論 0 0