android 阻尼动画,Android SpringAnimation 安卓模拟弹簧动画

本文介绍了Android SupportLibrary 25.3.0中新增的SpringAnimation,这是一个基于SpringForce的动画效果。SpringAnimation通过设置刚度和阻尼比模拟弹簧振动效果,可用于视图平移等动画场景。文中给出了代码示例,展示如何在用户触摸操作后使用SpringAnimation实现平滑回弹效果,并提供了完整源码供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在最近的Support Library更新中(25.3.0),新增或者修复了许多东西,具体可以看revisions,其中有一个新增的动画效果:SpringAnimation 即弹簧动画,随即,Android 开发者发布了一段简短的gistHere,演示了该动画库的简单使用。并在一个不存在的网站上post出gif演示:

870334f2e2d4?t=123

spring.gif

由于大神给出的代码不是很完整,出于好奇的心态,于是在gist的基础上复现了一下该效果,方便参考。

SpringAnimation

SpringAnimation是一个受SpringForce驱动的动画。弹簧力限定了弹簧的刚度,阻尼比以及静止位置。一旦弹簧动画开始,在每一帧上,弹簧力将更新动画的值和速度。动画一直运行,直到弹力达到平衡。如果在动画中使用了无阻尼的弹簧,动画将永远不会达到平衡,永远振荡下去。。。

该类提供了以下方法:

870334f2e2d4?t=123

SpringAnimation_public methods.png

代码示例

public class MainActivity extends Activity {

//XY坐标

private float downX, downY;

//调整参数的SeekBar

private SeekBar dampingSeekBar, stiffnessSeekBar;

//X/Y方向速度相关的帮助类

private VelocityTracker velocityTracker;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(android.R.id.content).setSystemUiVisibility(

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

stiffnessSeekBar = (SeekBar) findViewById(R.id.stiffness);

dampingSeekBar = (SeekBar) findViewById(R.id.damping);

velocityTracker = VelocityTracker.obtain();

final View box = findViewById(R.id.box);

findViewById(R.id.content).setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

downX = event.getX();

downY = event.getY();

velocityTracker.addMovement(event);

return true;

case MotionEvent.ACTION_MOVE:

box.setTranslationX(event.getX() - downX);

box.setTranslationY(event.getY() - downY);

velocityTracker.addMovement(event);

return true;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

velocityTracker.computeCurrentVelocity(1000);

if (box.getTranslationX() != 0) {

SpringAnimation animX = new SpringAnimation(box, SpringAnimation.TRANSLATION_X, 0);

animX.getSpring().setStiffness(getStiffnessSeekBar());

animX.getSpring().setDampingRatio(getDampingSeekBar());

animX.setStartVelocity(velocityTracker.getXVelocity());

animX.start();

}

if (box.getTranslationY() != 0) {

SpringAnimation animY = new SpringAnimation(box, SpringAnimation.TRANSLATION_Y, 0);

animY.getSpring().setStiffness(getStiffnessSeekBar());

animY.getSpring().setDampingRatio(getDampingSeekBar());

animY.setStartVelocity(velocityTracker.getYVelocity());

animY.start();

}

velocityTracker.clear();

return true;

}

return false;

}

});

}

/**

* 从SeekBar获取自定义的强度

*

* @return 强度float

*/

private float getStiffnessSeekBar() {

return Math.max(stiffnessSeekBar.getProgress(), 1f);

}

/**

* 从SeekBar获取自定义的阻尼

*

* @return 阻尼float

*/

private float getDampingSeekBar() {

return dampingSeekBar.getProgress() / 100f;

}

}

关键方法:

SpringAnimation animX = new SpringAnimation(box, SpringAnimation.TRANSLATION_X, 0);

查一下文档,这个构造方法的参数是什么意思?

第一个参数肯定是View啦,但是需要说明的是,这个动画将会改变View的所有属性,不仅仅是位置。

第二个参数是视图的属性索引;

第三个参数是弹簧被创建的最后位置

至于这个动画库的用途呢,就看开发者的想象力了。其他详情看源码,不多说了。

看demo 演示:

870334f2e2d4?t=123

SpringAnimation.gif

最后

按照国际惯例,附上完整源码SpringAnimation喜欢请star一个!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值