极光日报
首发于极光日报
Android - Spring Animation

Android - Spring Animation

简评:让应用的 View 像弹簧一样动起来。

Dynamic-animation 是 Android Support Library v25.3.0 引入的一个新模块。帮助开发者开发具有弹簧特征的动画效果。

你可能会说我用 BounceInterpolatorOvershootInterpolator就完全够了,或者自己写 Interpolator。但现在我们有了一个更简单的方法。

Dynamic-animation 中只包含了 4 个类:

可以看到,官方提供的这个库很简单。如果你想要更复杂的控制,可以看看 Facebook 的 Rebound library

集成

dependencies {
    compile 'com.android.support:support-dynamic-animation:25.3.0'
}

例子

下面的例子使用 Kotlin 编写。
Chrome 用户可直接点击图片查看 gif
class ScaleActivity : AppCompatActivity() {
    private companion object Params {
        val INITIAL_SCALE = 1f
        val STIFFNESS = SpringForce.STIFFNESS_MEDIUM
        val DAMPING_RATIO = SpringForce.DAMPING_RATIO_HIGH_BOUNCY
    }
 
    lateinit var scaleXAnimation: SpringAnimation
    lateinit var scaleYAnimation: SpringAnimation
    lateinit var scaleGestureDetector: ScaleGestureDetector
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_scale)
 
        // create scaleX and scaleY animations
        scaleXAnimation = createSpringAnimation(
                scalingView, SpringAnimation.SCALE_X,
                INITIAL_SCALE, STIFFNESS, DAMPING_RATIO)
        scaleYAnimation = createSpringAnimation(
                scalingView, SpringAnimation.SCALE_Y,
                INITIAL_SCALE, STIFFNESS, DAMPING_RATIO)
 
        setupPinchToZoom()
 
        scalingView.setOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_UP) {
                scaleXAnimation.start()
                scaleYAnimation.start()
            } else {
                // cancel animations so we can grab the view during previous animation
                scaleXAnimation.cancel()
                scaleYAnimation.cancel()
 
                // pass touch event to ScaleGestureDetector
                scaleGestureDetector.onTouchEvent(event)
            }
            true
        }
    }
 
    private fun setupPinchToZoom() {
        var scaleFactor = 1f
        scaleGestureDetector = ScaleGestureDetector(this,
                object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
                    override fun onScale(detector: ScaleGestureDetector): Boolean {
                        scaleFactor *= detector.scaleFactor
                        scalingView.scaleX *= scaleFactor
                        scalingView.scaleY *= scaleFactor
                        return true
                    }
                })
    }
}
原文中还有两个其他的示例,感兴趣的同学可以点击下面的原文进一步阅读。:)

原文:Introduction to SpringAnimation with examples

扩展阅读:


对了,4 月 8 日在深圳有个关于大数据技术的沙龙,感兴趣可以来看看。(这是一条硬广)

报名链接:大数据技术最佳实践 - 七牛架构师实践日

编辑于 2017-03-28

文章被以下专栏收录

    简介:每日导读(或翻译)三篇优质英文文章,内容 80% 涉及硅谷/编程/科技/,期待共同成长。