189 8069 5689

AndroidSpringAnimation弹性动画解析

也许你想在Android上实现这种反弹的动画效果。Android Support Library 25.3.0引入了Dynamic-animation增强动画,里面提供了几个类用于使动画呈现实现真实的物理效果。

创新互联建站始终坚持【策划先行,效果至上】的经营理念,通过多达十余年累计超上千家客户的网站建设总结了一套系统有效的推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都除甲醛等企业,备受客户认可。

Android SpringAnimation弹性动画解析

你会想,自己的动画里加上 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"?>


 



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

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

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


分享文章:AndroidSpringAnimation弹性动画解析
网站网址:http://cdxtjz.cn/article/gdedis.html

其他资讯