android 軟軟的動畫彈出選單,基於Facebook的Rebuond

戀貓de小郭發表於2016-12-08

 Hello,郭某又厚顏無恥的來碼水文了,年終將至,又要被別人家程式猿的年終刷屏(年終獎和我有個Context關係(ノಠ益ಠ)ノ彡┻━┻)。所以,今天就讓我們聊一點有意思♂的東西吧<( ̄ˇ ̄)/:“軟軟“的彈出選單,一戳就破。沒錯,今天的片頭就是這麼短,此短非彼短,因為下面也很短。

 
︿( ̄︶ ̄)︿我是路過的DEMO : github.com/CarGuo/Anim…
 

android 軟軟的動畫彈出選單,基於Facebook的Rebuond
等一下,我第二次彈出自帶點選效果
 

rebound

 安利Facebook開源的彈簧動畫庫,模擬物理彈簧的效果,讓直男♂的你從此軟下來,產品經理再也不需要擔心互動過硬了(✿◡‿◡)。

 rebound模擬的是物理效果,這裡主要是有兩個關鍵點:Tension(拉力系數)、Friction(摩擦係數)。Tension越大♀,彈性效果就越大,很符合邏輯是吧( ̄o ̄) ;Friction越大,受到的阻力就會越大,彈性效果就會降低。這裡注意的是,彈性雖好,但摩擦力也是必須的喲,學過物理的你應該知道,沒有摩擦力,根本停不下來啊,摩擦力太大,又進不···呸呸呸,又彈性不好。

 下方是facebook官方的demo,使用預設的F和T係數,建立一個Spring ,通過設定開始\接結束的係數,在監聽過程中通過getCurrentValue,設定你想要的移動\放大\透明度等等效果,來實現你的動畫,感覺是不是很ValueAnimation,簡單易上手。

 有興趣的可以去rebound下載官方demo,如果發現官方demo跑不來,可以試試我fork修改後的demo喲:github.com/CarGuo/rebo…

// 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);複製程式碼

實現動畫彈出框

 
進入正題:

1、首先我們定義一個佈局,包含四個圓形TAB,讓它們呈現如下圖效果。然後把它們都設定為GONE。

android 軟軟的動畫彈出選單,基於Facebook的Rebuond

2、建立一個Spring用於執行動畫。

  • 這裡我們使用的是SpringChain,可以自定義我們想要的拉力和摩擦力系數,從左到右是主拉力,主摩擦力,輔助拉力,輔助摩擦力。
  • 根據TAB的個數,我們對每一個View通過springChain.addSpring新增到佇列中,並設定對應的監聽。
  • setCurrentValue設定初始化的開始資料為父佈局的高度,這樣每一個item就可以從螢幕底部開始彈出。
  • springChain.setControlSpringIndex(0).getControlSpring().setEndValue(0);設定起主導作用的是第一個tab,最後的終止資料是0,也就是原來所在的位置。
  • 在onSpringUpdate通過getCurrentValue換算出tab的位置和大小。

android 軟軟的動畫彈出選單,基於Facebook的Rebuond

看下面,上面一堆廢話,那個傻X說了那麼多,哇塞,程式碼好簡單啊(^o^)/,是不是覺得站在巨人的肩膀上,很自豪啊。收回動畫就是把彈出的反過來即可,妥妥的。

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

for (int i = 0; i < list.size(); i++) {

    final View view = list.get(i);

    springChain.addSpring(new SimpleSpringListener() {
        @Override
        public void onSpringActivate(Spring spring) {
            super.onSpringActivate(spring);
            view.setVisibility(VISIBLE);
        }

        @Override
        public void onSpringUpdate(Spring spring) {
            view.setTranslationY((float) spring.getCurrentValue());
            float scale = (1 + 2 * (float) spring.getCurrentValue() / mainView.getHeight());
            view.setScaleX(scale);
            view.setScaleY(scale);
        }
    });
}

List<Spring> springs = springChain.getAllSprings();

for (int i = 0; i < springs.size(); i++) {
    springs.get(i).setCurrentValue(mainView.getHeight());
}

springChain.setControlSpringIndex(0).getControlSpring().setEndValue(0);複製程式碼

 最後我們額外來個副菜,既然彈出\收起都有效果,那麼“碰”起來也要有效果才對,這裡我們就參考微博的選單,在點選時候執行最後的動畫效果。

android 軟軟的動畫彈出選單,基於Facebook的Rebuond

 這個相對更加簡單,我們使用系統的AnimationSet ,將點選的TAB放大和透明化動畫一起執行,將其他的TAB同時縮小和透明化,動畫結束時讓tab隱藏起來,這樣一個完整的選單動畫就結束啦。(。・・)ノ是不是好短啊,都說好短啦。

AnimationSet animationSet = new AnimationSet(true);
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f,
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);

animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(alphaAnimation);

animationSet.setInterpolator(new AccelerateInterpolator());
animationSet.setDuration(200);
animationSet.setFillAfter(false);

animationSet.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
        view.setVisibility(GONE);
        ButtonClickLogin(view);

    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
});
view.startAnimation(animationSet);複製程式碼

最後說兩句

 
兩句。

android 軟軟的動畫彈出選單,基於Facebook的Rebuond
瞅完了吧

相關文章