工作原理
工作原理其实就是一个值到另一个值像弹簧一样变化,正常会使用0-1这个值来做弹性变化,得到的值并不只是从0到1,而是会大于1,在1的左右有些波动值,最后趋于1
效果图
代码
代码很简单,初始化弹簧动画,在ontouch中触发动画,得到的值在onSpringUpdate()中处理
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mball = findViewById(R.id.tv);
WindowManager systemService = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
width = systemService.getDefaultDisplay().getWidth();
height = systemService.getDefaultDisplay().getHeight();
//创建系统用于循环执行控件弹簧效果
SpringSystem mSpringSystem = SpringSystem.create();
//给系统添加一个弹簧
mSpring = mSpringSystem.createSpring();
int tension = 40; //张力系数
int friction = 3; //阻力系数
//根据张力系数和阻力系数创建一组弹簧参数
SpringConfig config = new SpringConfig(tension, friction);
//配置
mSpring.setSpringConfig(config);
//添加监听器,监听弹簧的形变
mSpring.addListener(new SimpleSpringListener() {
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
@Override
public void onSpringUpdate(Spring spring) {
float value = (float) spring.getCurrentValue();
mball.setX(width/2 + (point.x- width/2) * (1-value));
mball.setY(height/2 + (point.y - height/2) * (1-value));
Log.i("SpringSystem", value+"");
}
});
}
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mball.setX(event.getRawX()- mball.getWidth()/2);
mball.setY(event.getRawY()- mball.getHeight()/2);
break;
case MotionEvent.ACTION_MOVE:
mball.setX(event.getRawX()- mball.getWidth()/2);
mball.setY(event.getRawY()- mball.getHeight()/2);
//mSpring.setEndValue(0);
break;
case MotionEvent.ACTION_UP:
mSpring.setCurrentValue(0);
point.set((int) event.getRawX() - mball.getWidth()/2, (int) event.getRawY()- mball.getHeight()/2);
mSpring.setEndValue(1);
break;
default:
break;
}
return super.onTouchEvent(event);
}
其中触发动画的方法是mSpring.setEndValue(1);
表示值从0到1
mSpring.setCurrentValue(0);//让值归零