Android SpringAnimation弹性动画解析
短信预约 -IT技能 免费直播动态提醒
也许你想在Android上实现这种反弹的动画效果。Android Support Library 25.3.0引入了Dynamic-animation增强动画,里面提供了几个类用于使动画呈现实现真实的物理效果。
你会想,自己的动画里加上 BounceInterpolator或OvershootInterpolator 插值器也能达到这种效果,然而实际上达不到。当然你也可以自己写插值器,如果你不嫌麻烦的话。
SpringAnimation弹性动画实现方法
gradle引入,最低支持API16
dependencies {
compile 'com.android.support:support-dynamic-animation:25.3.0'
}
定义SpringForce,定义弹性特质
SpringForce spring = new SpringForce(finalPosition);
spring.setStiffness(stiffness);
spring.setDampingRatio(dampingRatio);
定义SpringAnimation,并关联SpringForce对象
SpringAnimation animation = new SpringAnimation(view, property);
animation.setSpring(spring);
代码如下
PositionActivity.java
public class PositionActivity extends AppCompatActivity {
float STIFFNESS = SpringForce.STIFFNESS_MEDIUM;//硬度
float DAMPING_RATIO = SpringForce.DAMPING_RATIO_HIGH_BOUNCY;//阻尼
SpringAnimation xAnimation;//x方向
SpringAnimation yAnimation;//y方向
View movingView;//图片
float dX = 0f;
float dY = 0f;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_position);
movingView = findViewById(R.id.movingView);
// 以图片的初始位置创建动画对象
movingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
xAnimation = createSpringAnimation(
movingView, SpringAnimation.X, movingView.getX(), STIFFNESS, DAMPING_RATIO);
yAnimation = createSpringAnimation(
movingView, SpringAnimation.Y, movingView.getY(), STIFFNESS, DAMPING_RATIO);
//初始位置确定,移除监听
movingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
movingView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// 计算到左上角的距离
dX = view.getX() - event.getRawX();
dY = view.getY() - event.getRawY();
// 取消动画以便按住图片
xAnimation.cancel();
yAnimation.cancel();
break;
case MotionEvent.ACTION_MOVE:
// 另一种改变View的LayoutParams(位置)的方式
movingView.animate()
.x(event.getRawX() + dX)
.y(event.getRawY() + dY)
.setDuration(0)
.start();
break;
case MotionEvent.ACTION_UP:
xAnimation.start();
yAnimation.start();
break;
}
return true;
}
});
}
SpringAnimation createSpringAnimation(View view,
DynamicAnimation.ViewProperty property,
Float finalPosition,
@FloatRange(from = 0.0) Float stiffness,
@FloatRange(from = 0.0) Float dampingRatio) {
//创建弹性动画类SpringAnimation
SpringAnimation animation = new SpringAnimation(view, property);
//SpringForce类,定义弹性特质
SpringForce spring = new SpringForce(finalPosition);
spring.setStiffness(stiffness);
spring.setDampingRatio(dampingRatio);
//关联弹性特质
animation.setSpring(spring);
return animation;
}
}
activity_position.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PositionActivity">
<ImageView
android:id="@+id/movingView"
android:layout_width="128dp"
android:layout_height="128dp"
android:layout_gravity="center"
android:class="lazy" data-src="@drawable/android"
android:tint="@color/colorPrimary"
tools:ignore="ContentDescription"/>
</FrameLayout>
触摸改变图片的位置,松开手启动动画。
翻译自https://www.thedroidsonroids.com/blog/android/springanimation-examples/,原作者使用Kotlin语言实现的。
您可能感兴趣的文章:SpringAnimation 实现菜单从顶部弹出从底部消失动画效果
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341