1. 程式人生 > >Rebound-Android的彈簧動畫庫

Rebound-Android的彈簧動畫庫

ask 之前 att rep 下載地址 創建 tabbar fig 重復

簡介

官方網站

github

Rebound是facebook出品的一個彈簧動畫庫,與之對應的iOS版本有一個pop動畫庫,也是非常的強大給力。Facebook真是互聯網企業中的楷模,開源了很多的實用開源庫,大贊一個!!!

講解Rebound之前,先看看我們根據Rebound高仿的新浪微博彈出菜單,看效果圖:

技術分享

話說回來,facebook為啥推出這個庫呢?主要就是現有的動畫離真實物理世界差別比較明顯,為了讓動畫看起來真實自然,帶有力量的效果,Rebound應運而生。兩個比較重要的參數,一個是拉力Tension,一個是摩擦力Friction,拉力越大,彈簧效果越明顯;摩擦力越大,彈框效果阻力越大、越不明顯。如果這個摩擦力的值設置為0,就像真實世界中處於真空狀態,一點摩擦力都沒有,這個彈簧效果會一直無限制重復下去,根本停不下來,不信看效果圖:

技術分享

我們把摩擦力的值改成1試試:

技術分享

初級用法

Rebound提供了非常簡潔的api方法來供我們調用,我們只需要配置一些簡單的參數就可以使用了,下面看看官網給出的例子:

// Create a system to run the physics loop for a set of springs.
SpringSystem springSystem = SpringSystem.create();

// Add a spring to the system.
Spring spring = springSystem.createSpring();

// Add a listener to observe the motion of the spring.
spring.addListener(new SimpleSpringListener() {

  @Override
  public void onSpringUpdate(Spring spring) {
    // You can observe the updates in the spring
    // state by asking its current value in onSpringUpdate.
    float value = (float) spring.getCurrentValue();
    float scale = 1f - (value * 0.5f);
    myView.setScaleX(scale);
    myView.setScaleY(scale);
  }
});

// Set the spring in motion; moving from 0 to 1
spring.setEndValue(1);

我們看下對應的效果圖:

技術分享

你們發現,好像彈簧效果不明顯,Rebound默認的拉力和摩擦力參數分別是40和7,我們看下Rebound裏面有個defaultConfig

public static SpringConfig defaultConfig = SpringConfig.fromOrigamiTensionAndFriction(40, 7);

為了讓彈簧效果更明顯,我們修改下SpringConfig的值,代碼如下:

spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(100,1));

我們將拉力值改成100,摩擦力值改成1,效果圖如下:

技術分享

效果很贊了吧!

高級用法:多個view連鎖動畫

如果想要做很多view的連鎖動畫怎麽辦?Rebound也提供了SpringChain這個接口。直接看代碼吧:

SpringChain springChain = SpringChain.create(40,6,50,7);

int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
    final View view = viewGroup.getChildAt(i);

    springChain.addSpring(new SimpleSpringListener() {
        @Override
        public void onSpringUpdate(Spring spring) {
            view.setTranslationY((float) spring.getCurrentValue());
        }
    });
}

List<Spring> springs = springChain.getAllSprings();
for (int i = 0; i < springs.size(); i++) {
    springs.get(i).setCurrentValue(400);
}

springChain.setControlSpringIndex(2).getControlSpring().setEndValue(0);

效果圖如下:

技術分享

我們來看看SpringChain這個類,創建它有兩個create方法:

  1. 默認無參數create()
  2. 有參數的create(int mainTension,int mainFriction,int attachmentTension,int attachmentFriction)

其中帶參數的第一個參數表示起主導作用spring的拉力系數,第二個參數表示起主導作用Spring的摩擦力系數,第三個和第四個表示附屬的拉力和摩擦力系數

SpringChain需要設置一個起主導控制作用的Spring,通過setControlSpringIndex方法來設置

高仿新浪彈出菜單

先看下高仿後的效果圖:

技術分享

這裏給出示例代碼:

PopMenu popMenu = new PopMenu.Builder().attachToActivity(MainActivity.this)
                .addMenuItem(new PopMenuItem("文字", getResources().getDrawable(R.drawable.tabbar_compose_idea)))
                .addMenuItem(new PopMenuItem("照片/視頻", getResources().getDrawable(R.drawable.tabbar_compose_photo)))
                .addMenuItem(new PopMenuItem("頭條文章", getResources().getDrawable(R.drawable.tabbar_compose_headlines)))
                .addMenuItem(new PopMenuItem("簽到", getResources().getDrawable(R.drawable.tabbar_compose_lbs)))
                .addMenuItem(new PopMenuItem("點評", getResources().getDrawable(R.drawable.tabbar_compose_review)))
                .addMenuItem(new PopMenuItem("更多", getResources().getDrawable(R.drawable.tabbar_compose_more)))
                .setOnItemClickListener(new PopMenuItemListener() {
                    @Override
                    public void onItemClick(PopMenu popMenu, int position) {
                        Toast.makeText(MainActivity.this, "你點擊了第" + position + "個位置", Toast.LENGTH_SHORT).show();
                    }
                })
                .build();   
popMenu.show();

這裏由於篇幅原因,就暫時先不講解實現原理了,如需要看源碼去我的github上下載,下載地址為:高仿新浪彈出菜單

Rebound-Android的彈簧動畫庫