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的一个动画库,rebound就是使动画更加符合现实生活的情景。
  • 在 http://facebook.github.io/rebound/上可以通过点击图片感受一下动画效果。它的效果受到tension(张力),friction(摩擦力)影响,通过生活中的体验以及调节两个值我们可以体验到不同的动画效果,tension的值越大,friction 的值越小效果就越明显,反之相反。

使用

首先添加依赖

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

参考官方demo 写的简单图片缩放例子

private final View mImageView;

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

  @Override
  public void onSpringUpdate(Spring spring) {
    // 在这里可以根据自己的需求设置view 的动画效果
    //下面方法通过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);//设置静止时候的值为1
            break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_CANCEL:
            spring.setEndValue(0);
            break;
        }
        return true;
      }
    });

在onSpringUpdate的回调中的mapValueFromRangeToRange(double value,double fromLow,double fromHigh,double toLow,double toHigh)

SpringUtil 是库中的工具类,从方法名可以开出是一个映射关系,把当前value值从0~1映射到1~0.5中去。
当按下的时候我们设置为1,对应到0.5,所以完全按下后图片会缩小至0.5倍,抬起反之,中间的状态就是通过不断变化的value 值确定。
我们可以通过设置Spring的张力和摩擦力
mScaleSpring.setSpringConfig(new SpringConfig(40,1.4));改变动画效果。

多个动画联动效果

通过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 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

我们要对每个view设置Spring通过springChain.addSpring添加。
SpringChain 实现了SpringListener 接口,含有一个Spring集合,一个SpringListener集合,在addSpring代码实现

  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;
  }

多个动画联动鱼单个不同的是需要指定第几个view做为带头的那个,通过springChain.setControlSpringIndex(finalI).getControlSpring().setEndValue(1);
这样就实现了多个动画一起联通的效果。如果需要其他的动效的话可以自己实现,rebound 的整体用法还是比较简单的。

你可能感兴趣的:(Rebound)