Android动画和Transition系列文章
  • 初识属性动画——使用Animator创建动画
  • 再谈属性动画——介绍以及自定义Interpolator插值器
  • 三谈属性动画——Keyframe以及ViewPropertyAnimator
  • 让View具有减速效果的动画——FlingAnimation
  • 让View具有弹性效果的动画——SpringAnimation
  • 让View跟随状态动起来——StateListAnimator
  • 仿抖音发布按住拍呼吸效果
  • Jetpack学习之——使用动画缩放图片
  • 使用动画隐藏或显示View
  • Android中具有动画效果的图片资源
  • ViewGroup内容改变时的动画效果—LayoutTransition
  • 在布局切换之间实现Transition动画
  • 在Activity切换之间实现Transition动画
  • 让转场更加酷炫——自定义Transition

Google除了提供了属性动画之外,还提供了一种基于物理的动画,叫做DynamicAnimation,与物理世界更贴近,关于这块可以参考https://www.jianshu.com/p/46b1cdc253e9。

目前主要有两种DynamicAnimation,分别是:

  • Spring Animation 类比弹力

  • Fling Animation 类比速度、动量

本文主要介绍Fling Animation。话不多说,先看下官方demo示例:

在松手后,会继续有动画的效果,逐渐减慢直至停止,是不是和现实生活中很类似?因为有摩擦力,所以会不断减少,这时高中老师教给我们的牛顿力学可以发挥用场了。

再来看下本文最终的demo示例:


拖动ImageView,松手的一瞬间,如果垂直方向的加速度大于水平方向的,那么垂直方向进行动画;反之水平方向运动,运动范围限制在屏幕中。

FlingAnimation的使用

FlingAnimation的使用主要分为两步骤:

  1. 添加支持库
dependencies {implementation 'com.android.support:support-dynamic-animation:28.0.0'}
  1. 创建一个FlingAnimation
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

FlingAnimation的创建需要指定View以及动画的属性,接下来就是设置一些属性,

  • setStartVelocity(float):设置起始加速度,单位是改变的属性每秒,默认是0。如果需要使用dp转pixel,可以使用下段代码:
float pixelPerSecond = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpPerSecond,getResources().getDisplayMetrics());
  • setMinValue(float):设置动画的最小值。这个值是创建FlingAnimation中的属性值的最小值,也就是说属性值不过小于该值。
  • setMaxValue(float):与上面类似,只不过是最大值,min<=属性值<=max。
  • setFriction(float):设置摩擦力,学过力学的都知道,没有摩擦力,那么将一直运动下去;而摩擦力越大,那么将会越快停止,默认值是1。
  • setMinimumVisibleChange(float):当创建一个单位不是pixel的自定义属性时,需要设置该值;DynamicAnimation.ViewProperty里面的属性是不需要设置该值的。

Demo示例代码

学完了理论知识,就看一下代码了,布局很简单,就一个ImageView,将touch事件交给了GestureDetector,然后在onFling()方法中实现FlingAnimation动画;有一点需要注意的是,FlingAnimation改变的是transitionX和transitionY属性,为了限制在屏幕内动画,因此计算了x和y方向的最大值,具体代码如下:

class FlingAnimationActivity : AppCompatActivity() {lateinit var gestureDetector: GestureDetectorvar maxTransitionX: Int? = nullvar maxTransitionY: Int? = nullprivate val gestureListener = object : GestureDetector.SimpleOnGestureListener() {override fun onDown(e: MotionEvent?): Boolean {return true}override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {if (Math.abs(velocityX) > Math.abs(velocityY)) {FlingAnimation(ivImg, DynamicAnimation.TRANSLATION_X).apply {setStartVelocity(velocityX)setMinValue(0f)setMaxValue(maxTransitionX!!.toFloat())friction = 1.1fstart()}} else {FlingAnimation(ivImg, DynamicAnimation.TRANSLATION_Y).apply {setStartVelocity(velocityY)setMinValue(0f)setMaxValue(maxTransitionY!!.toFloat())friction = 1.1fstart()}}return true}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_fling)mainLayout.viewTreeObserver.addOnGlobalLayoutListener {maxTransitionX = mainLayout.width - ivImg.widthmaxTransitionY = mainLayout.height - ivImg.height}gestureDetector = GestureDetector(this, gestureListener)ivImg.setOnTouchListener { v, event ->gestureDetector!!.onTouchEvent(event)}}
}

参考文章

  • https://developer.android.com/guide/topics/graphics/fling-animation?hl=zh-cn
  • https://developer.android.com/reference/android/support/animation/FlingAnimation
  • https://proandroiddev.com/introduction-to-physics-based-animations-in-android-1be27e468835
  • https://medium.com/@temidjoy/android-animations-and-transistions-fling-animation-f5bf42bfef55
  • https://www.jianshu.com/p/46b1cdc253e9

关注我的技术公众号,不定期会有技术文章推送,不敢说优质,但至少是我自己的学习心得。微信扫一扫下方二维码即可关注:

让View具有减速效果的动画——FlingAnimation相关推荐

  1. 让View具有弹性效果的动画——SpringAnimation

    Android动画和Transition系列文章 初识属性动画--使用Animator创建动画 再谈属性动画--介绍以及自定义Interpolator插值器 三谈属性动画--Keyframe以及Vie ...

  2. android下雨动画效果,Android 自定义View(二) 下雨效果

    Rain.gif Android 自定义View(二) 下雨效果 一 实现思路, 雨点用线段表示,通过控制线段的大小和宽度来表示不同的线段. 一个雨点下雨的过程可以表示为一条直线,一次雨点在下雨的过程 ...

  3. dismiss ios pop效果_iOS 动画框架pop使用方法

    pop支持4种动画类型:弹簧动画效果.衰减动画效果.基本动画效果和自定义动画效果. 弹簧动画效果 1.效果图如下: 2.控制器代码如下,首先用pod安装导入pop框架: #import "V ...

  4. 仿电视关机效果的动画

    仿电视关机效果的动画 效果图 主要代码 package com.zhengsonglan.tvanimation;import android.graphics.Matrix; import andr ...

  5. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

  6. 同时对view延时执行两个动画时候的现象

    同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...

  7. android view过度动画,为View的切换添加过渡动画

    为View的切换添加过渡动画 Author: nex3z 2016-01-09 动画效果不仅可以使得应用更加吸引人,更可以突出变化的内容,使得用户能够更好地理解应用的操作和运作方式.Android提供 ...

  8. android+清除循环动画,android自定义View之(4)-一键清除动画

    android自定义View之(四)------一键清除动画 1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解, ...

  9. 自定义ListView实现任意View跑马灯效果

    自定义ListView实现任意View跑马灯效果 标签(空格分隔): 开源项目 看图 话不多说,先来看下大图效果吧,这里的GIF录制有点渣,不过真实的跑出来的效果还是挺不错的. 前言 最近项目中会加入 ...

最新文章

  1. IT部门的服务工作方式、工作内容有了彻底的改变——安徽移动通信有限责任公司...
  2. 微信小程序实现分类菜单 swiper分类菜单
  3. mysql升级5.5
  4. 支付宝生成RSA密钥,上传应用公钥的完整流程
  5. python redis 性能测试台_Redis性能测试
  6. 【转载】消息队列RabbitMQ入门介绍
  7. php+mysql将大数据sql文件导入数据库
  8. 如何使用终端来调节Mac鼠标移动速度?
  9. BZOJ 1857: [Scoi2010]传送带
  10. Openssl多个安全补丁简易分析危害及修复方案
  11. Oracle sql优化工具
  12. 【control】模型预测控制(MPC)
  13. 华为手机如何连计算机,华为手机如何连接电脑 华为手机助手怎么连接华为手机...
  14. 全网最完整金融时间序列模型+动态模型
  15. 状态压缩.种花小游戏
  16. 计算机拓扑结构定义,计算机网络拓扑结构的定义
  17. python爬虫工程师面试自我介绍范文_计算机工程师面试自我介绍范文五篇
  18. 7月生日会|清凉的惊喜与祝福
  19. 软件工程基础知识--运行和维护
  20. 腾讯云多人视频会议 TUIRoom 功能体验

热门文章

  1. 耳机能听到自己说话的声音
  2. 高效的APP在线制作平台,让梦想轻松孵化器
  3. Magic3D(MyGUI)简单使用
  4. win10安装虚拟机
  5. uploader什么意思_webuploader
  6. win10服务和控制器应用CPU占用过高
  7. OpenLayers 3实践与原理探究3-ol3一个完整的例子
  8. 固态硬盘坏了 安装到里面的软件无法卸载也无法安装
  9. ASUS ZenBook Duo 14 UX481电脑 Hackintosh 黑苹果efi引导文件
  10. java推送叮叮消息,叮叮叮!请及时签收入门学习Java导航路线