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<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));
}
}
我们要对每个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 的整体用法还是比较简单的。
网友评论