Google除了提供了属性动画之外,还提供了一种基于物理的动画,叫做DynamicAnimation,与物理世界更贴近,关于这块可以参考https://www.jianshu.com/p/46b1cdc253e9。
目前主要有两种DynamicAnimation,分别是:
在松手后,会继续有动画的效果,逐渐减慢直至停止,是不是和现实生活中很类似?因为有摩擦力,所以会不断减少,这时高中老师教给我们的牛顿力学可以发挥用场了。
再来看下本文最终的demo示例:
拖动ImageView,松手的一瞬间,如果垂直方向的加速度大于水平方向的,那么垂直方向进行动画;反之水平方向运动,运动范围限制在屏幕中。
FlingAnimation的使用主要分为两步骤:
dependencies {
implementation 'com.android.support:support-dynamic-animation:28.0.0'
}
val fling =FlingAnimation(view,DynamicAnimation.SCROLL_X)
floatpixelPerSecond=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpPerSecond,getResources().getDisplayMetrics());
学完了理论知识,就看一下代码了,布局很简单,就一个ImageView,将touch事件交给了GestureDetector,然后在onFling()方法中实现FlingAnimation动画;有一点需要注意的是,FlingAnimation改变的是transitionX和transitionY属性,为了限制在屏幕内动画,因此计算了x和y方向的最大值,具体代码如下:
class FlingAnimationActivity : AppCompatActivity() {
lateinit var gestureDetector: GestureDetector var maxTransitionX: Int? = null var maxTransitionY: Int? = null
private 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.1f start() } } else { FlingAnimation(ivImg, DynamicAnimation.TRANSLATION_Y).apply { setStartVelocity(velocityY) setMinValue(0f) setMaxValue(maxTransitionY!!.toFloat()) friction = 1.1f start() } } return true } }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_fling)
mainLayout.viewTreeObserver.addOnGlobalLayoutListener { maxTransitionX = mainLayout.width - ivImg.width maxTransitionY = mainLayout.height - ivImg.height }
gestureDetector = GestureDetector(this, gestureListener)
ivImg.setOnTouchListener { v, event -> gestureDetector!!.onTouchEvent(event) } }}
本文分享自 每天学点Android知识 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!