全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android SpringAnimation弹性动画解析

也许你想在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语言实现的。

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


# Android  # SpringAnimation  # 弹性动画  # SpringAnimation 实现菜单从顶部弹出从底部消失动画效果  # 自己的  # 插值  # 几个  # 如果你  # 你会  # 也能  # 你想  # 你也可以  # 达不到  # 大家多多  # 移除  # 不嫌  # 引入了  # public  # PositionActivity  # setSpring  # AppCompatActivity  # float  # STIFFNESS  # extends 


相关文章: 寿县云建站:智能SEO优化与多行业模板快速上线指南  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  网站app免费制作软件,能免费看各大网站视频的手机app?  Thinkphp 中 distinct 的用法解析  Bpmn 2.0的XML文件怎么画流程图  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  香港服务器租用费用高吗?如何避免常见误区?  网页设计网站制作软件,microsoft office哪个可以创建网页?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  建站之星2.7模板快速切换与批量管理功能操作指南  如何基于PHP生成高效IDC网络公司建站源码?  潮流网站制作头像软件下载,适合母子的网名有哪些?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何彻底删除建站之星生成的Banner?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何快速搭建个人网站并优化SEO?  如何通过FTP空间快速搭建安全高效网站?  建站OpenVZ教程与优化策略:配置指南与性能提升  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  南京网站制作费用,南京远驱官方网站?  建站之星下载版如何获取与安装?  如何快速搭建高效简练网站?  如何在IIS中新建站点并解决端口绑定冲突?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  怎么将XML数据可视化 D3.js加载XML  表情包在线制作网站免费,表情包怎么弄?  如何在阿里云虚拟服务器快速搭建网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站之星北京办公室:智能建站系统与小程序生成方案解析  ,想在网上投简历,哪几个网站比较好?  如何在万网ECS上快速搭建专属网站?  建站之星备案流程有哪些注意事项?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  已有域名和空间如何快速搭建网站?  如何快速上传自定义模板至建站之星?  如何制作网站标识牌,动态网站如何制作(教程)?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在腾讯云服务器上快速搭建个人网站?  如何零基础开发自助建站系统?完整教程解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。