Rebound

Spring Animations for Android

  • Rebound is a java library that models spring dynamics. Rebound spring models can be used to create animations that feel natural by introducing real world physics to your application胖替。rebound是Facebook的一個(gè)動(dòng)畫庫,rebound就是使動(dòng)畫更加符合現(xiàn)實(shí)生活的情景。
  • http://facebook.github.io/rebound/上可以通過點(diǎn)擊圖片感受一下動(dòng)畫效果营勤。它的效果受到tension(張力)稠曼,friction(摩擦力)影響绍傲,通過生活中的體驗(yàn)以及調(diào)節(jié)兩個(gè)值我們可以體驗(yàn)到不同的動(dòng)畫效果荠耽,tension的值越大,friction 的值越小效果就越明顯,反之相反气嫁。

使用

首先添加依賴

dependencies {
  compile 'com.facebook.rebound:rebound:0.3.8'
}

參考官方demo 寫的簡(jiǎn)單圖片縮放例子

private final View mImageView;

SpringSystem springSystem = SpringSystem.create();
Spring spring = springSystem.createSpring();
spring.addListener(new SimpleSpringListener() {

  @Override
  public void onSpringUpdate(Spring spring) {
    // 在這里可以根據(jù)自己的需求設(shè)置view 的動(dòng)畫效果
    //下面方法通過spring 得到currentvalue
   double value=spring.getCurrentValue()简识;
     float mappedValue = (float) SpringUtil.mapValueFromRangeToRange(value, 0, 1, 1, 0.5);
      mImageView.setScaleX(mappedValue);
      mImageView.setScaleY(mappedValue);
  }
});
mImageView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            spring.setEndValue(1);//設(shè)置靜止時(shí)候的值為1
            break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_CANCEL:
            spring.setEndValue(0);
            break;
        }
        return true;
      }
    });

在onSpringUpdate的回調(diào)中的mapValueFromRangeToRange(double value,double fromLow,double fromHigh,double toLow,double toHigh)

SpringUtil 是庫中的工具類,從方法名可以開出是一個(gè)映射關(guān)系道盏,把當(dāng)前value值從0~1映射到1~0.5中去伟葫。
當(dāng)按下的時(shí)候我們?cè)O(shè)置為1,對(duì)應(yīng)到0.5弛槐,所以完全按下后圖片會(huì)縮小至0.5倍,抬起反之逾柿,中間的狀態(tài)就是通過不斷變化的value 值確定璧亮。
我們可以通過設(shè)置Spring的張力和摩擦力
mScaleSpring.setSpringConfig(new SpringConfig(40,1.4));改變動(dòng)畫效果镀裤。

多個(gè)動(dòng)畫聯(lián)動(dòng)效果

通過SpringChain

package com.example.wys.rebound;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import com.example.wys.rebound.app.PlaygroundActivity;
import com.facebook.rebound.SimpleSpringListener;
import com.facebook.rebound.Spring;
import com.facebook.rebound.SpringChain;
import com.facebook.rebound.SpringSystem;
import com.facebook.rebound.SpringUtil;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private ImageView imageView1,imageView2,imageView3,imageView4;
    private SpringChain springChain;
    private SpringSystem springSystem;
    private ArrayList<ImageView> imageViews=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        springSystem=SpringSystem.create();
        springChain=SpringChain.create();
        imageView1= (ImageView) findViewById(R.id.image1);
        imageView2= (ImageView) findViewById(R.id.image2);
        imageView3= (ImageView) findViewById(R.id.image3);
        imageView4= (ImageView) findViewById(R.id.image4);
        imageViews.add(imageView1);
        imageViews.add(imageView2);
        imageViews.add(imageView3);
        imageViews.add(imageView4);

        for (int i=0;i<imageViews.size();i++){
            final int finalI = i;
            springChain.addSpring(new SimpleSpringListener(){
                @Override
                public void onSpringUpdate(Spring spring) {
                    float v = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, 1, 0.7);
                    imageViews.get(finalI).setScaleX(v);
                    imageViews.get(finalI).setScaleY(v);
                }
            });
            imageViews.get(i).setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    int action = motionEvent.getAction();
                    switch (action){
                        case MotionEvent.ACTION_DOWN:
                            springChain.setControlSpringIndex(finalI).getControlSpring().setEndValue(1);
                            break;
                        case MotionEvent.ACTION_CANCEL:
                        case MotionEvent.ACTION_UP:
                            springChain.getControlSpring().setEndValue(0);
                            break;

                    }
                    return true;
                }
            });

        }

    }

    public void play(View view){
        startActivity(new Intent(this, PlaygroundActivity.class));

    }
}

我們要對(duì)每個(gè)view設(shè)置Spring通過springChain.addSpring添加纺且。
SpringChain 實(shí)現(xiàn)了SpringListener 接口载碌,含有一個(gè)Spring集合步咪,一個(gè)SpringListener集合,在addSpring代碼實(shí)現(xiàn)

  public SpringChain addSpring(final SpringListener listener) {
    // We listen to each spring added to the SpringChain and dynamically chain the springs together
    // whenever the control spring state is modified.
    Spring spring = mSpringSystem
        .createSpring()
        .addListener(this)
        .setSpringConfig(mAttachmentSpringConfig);
    mSprings.add(spring);
    mListeners.add(listener);
    return this;
  }

多個(gè)動(dòng)畫聯(lián)動(dòng)魚單個(gè)不同的是需要指定第幾個(gè)view做為帶頭的那個(gè)悯周,通過springChain.setControlSpringIndex(finalI).getControlSpring().setEndValue(1);
這樣就實(shí)現(xiàn)了多個(gè)動(dòng)畫一起聯(lián)通的效果。如果需要其他的動(dòng)效的話可以自己實(shí)現(xiàn),rebound 的整體用法還是比較簡(jiǎn)單的生均。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腥刹,隨后出現(xiàn)的幾起案子马胧,更是在濱河造成了極大的恐慌,老刑警劉巖衔峰,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩脊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垫卤,警方通過查閱死者的電腦和手機(jī)威彰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穴肘,“玉大人歇盼,你說我怎么就攤上這事∑栏В” “怎么了豹缀?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)慨代。 經(jīng)常有香客問我耿眉,道長(zhǎng),這世上最難降的妖魔是什么鱼响? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任鸣剪,我火速辦了婚禮,結(jié)果婚禮上丈积,老公的妹妹穿的比我還像新娘筐骇。我一直安慰自己,他們只是感情好江滨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布铛纬。 她就那樣靜靜地躺著,像睡著了一般唬滑。 火紅的嫁衣襯著肌膚如雪告唆。 梳的紋絲不亂的頭發(fā)上棺弊,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音擒悬,去河邊找鬼模她。 笑死,一個(gè)胖子當(dāng)著我的面吹牛懂牧,可吹牛的內(nèi)容都是我干的侈净。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼僧凤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼畜侦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躯保,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤旋膳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后途事,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溺忧,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盯孙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲁森。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡振惰,死狀恐怖歌溉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骑晶,我是刑警寧澤痛垛,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站桶蛔,受9級(jí)特大地震影響匙头,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仔雷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一蹂析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碟婆,春花似錦电抚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至公给,卻和暖如春借帘,著一層夾襖步出監(jiān)牢的瞬間蜘渣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工肺然, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔫缸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓狰挡,卻偏偏與公主長(zhǎng)得像捂龄,于是被迫代替她去往敵國和親释涛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子加叁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • Rebound源碼分析 對(duì)于想體驗(yàn)一下rebound的效果,又懶得clone和編譯代碼的唇撬,這里提供一個(gè)demo a...
    MarkZhai閱讀 4,364評(píng)論 1 22
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理它匕,服務(wù)發(fā)現(xiàn),斷路器窖认,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 對(duì)rebound的阻尼效果很感興趣豫柬,但是有些時(shí)候并不想引用整個(gè)的rebound庫。只想利用它計(jì)算各個(gè)時(shí)間點(diǎn)對(duì)...
    夜宿金陵渚閱讀 1,111評(píng)論 1 2
  • ios動(dòng)畫和android動(dòng)畫 長(zhǎng)久以來我都有這么一個(gè)疑問扑浸,為什么同樣的設(shè)計(jì)烧给,同樣的動(dòng)畫效果,在ios上的效果要明...
    韓sang閱讀 7,907評(píng)論 5 17
  • Facebook是什么就不贅述喝噪,我知道rebound這個(gè)庫也是在看一個(gè)叫做Paper的軟件的時(shí)候延伸到的础嫡,首先我介...
    lumenghz閱讀 2,194評(píng)論 0 3