首页 > 系统 > Android > 正文

Android SpringAnimation弹性动画解析

2019-12-12 03:14:34
字体:
来源:转载
供稿:网友

也许你想在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;   }  }); } /**  * 创建弹性动画  * @param view 动画关联的控件  * @param property 动画作用的属性  * @param finalPosition 动画结束的位置  * @param stiffness 硬度  * @param dampingRatio 阻尼  * @return  */ 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:src="@drawable/android"  android:tint="@color/colorPrimary"  tools:ignore="ContentDescription"/></FrameLayout>

触摸改变图片的位置,松开手启动动画。

翻译自https://www.thedroidsonroids.com/blog/android/springanimation-examples/,原作者使用Kotlin语言实现的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表