Android - Spring Animation

簡評:讓應用的 View 像彈簧一樣動起來。

Dynamic-animation 是 Android Support Library v25.3.0 引入的一個新模塊。幫助開發者開發具有彈簧特徵的動畫效果。

你可能會說我用 BounceInterpolatorOvershootInterpolator就完全夠了,或者自己寫 Interpolator。但現在我們有了一個更簡單的方法。

Dynamic-animation 中只包含了 4 個類:

  • DynamicAnimation<T extends DynamicAnimation<T>>:基礎類。

  • DynamicAnimation.ViewProperty:控制動畫對 View 屬性的訪問。比如:ALPHA, ROTATION...

  • SpringAnimation:由 SpringForce 驅動的動畫類。

  • SpringForce:定義動畫具有的彈簧特徵。其中有三個關鍵的參數:

    • finalPosition:靜止位置。
    • stiffness:即彈簧常數,物體的勁度係數。
    • dampingRatio:阻尼比。描述系統擾動後的振蕩衰減過程。

可以看到,官方提供的這個庫很簡單。如果你想要更複雜的控制,可以看看 Facebook 的 Rebound library。

集成

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

例子

下面的例子使用 Kotlin 編寫。

Chrome 用戶可直接點擊圖片查看 gif

class ScaleActivity : AppCompatActivity() {n private companion object Params {n val INITIAL_SCALE = 1fn val STIFFNESS = SpringForce.STIFFNESS_MEDIUMn val DAMPING_RATIO = SpringForce.DAMPING_RATIO_HIGH_BOUNCYn }n n lateinit var scaleXAnimation: SpringAnimationn lateinit var scaleYAnimation: SpringAnimationn lateinit var scaleGestureDetector: ScaleGestureDetectorn n override fun onCreate(savedInstanceState: Bundle?) {n super.onCreate(savedInstanceState)n setContentView(R.layout.activity_scale)n n // create scaleX and scaleY animationsn scaleXAnimation = createSpringAnimation(n scalingView, SpringAnimation.SCALE_X,n INITIAL_SCALE, STIFFNESS, DAMPING_RATIO)n scaleYAnimation = createSpringAnimation(n scalingView, SpringAnimation.SCALE_Y,n INITIAL_SCALE, STIFFNESS, DAMPING_RATIO)n n setupPinchToZoom()n n scalingView.setOnTouchListener { _, event ->n if (event.action == MotionEvent.ACTION_UP) {n scaleXAnimation.start()n scaleYAnimation.start()n } else {n // cancel animations so we can grab the view during previous animationn scaleXAnimation.cancel()n scaleYAnimation.cancel()n n // pass touch event to ScaleGestureDetectorn scaleGestureDetector.onTouchEvent(event)n }n truen }n }n n private fun setupPinchToZoom() {n var scaleFactor = 1fn scaleGestureDetector = ScaleGestureDetector(this,n object : ScaleGestureDetector.SimpleOnScaleGestureListener() {n override fun onScale(detector: ScaleGestureDetector): Boolean {n scaleFactor *= detector.scaleFactorn scalingView.scaleX *= scaleFactorn scalingView.scaleY *= scaleFactorn return truen }n })n }n}n

原文中還有兩個其他的示例,感興趣的同學可以點擊下面的原文進一步閱讀。:)

原文:Introduction to SpringAnimation with examples

擴展閱讀:

  • Android O 前瞻 - 是時候和 Implict Broadcast 說再見了

對了,4 月 8 日在深圳有個關於大數據技術的沙龍,感興趣可以來看看。(這是一條硬廣)

報名鏈接:大數據技術最佳實踐 - 七牛架構師實踐日


推薦閱讀:

面向對象中的依賴注入概念本質上是否與面向過程中的模塊導入一致的?
OO 的設計理念對 Python 來說是重點嗎?
Bug螺旋
極樂技術周報(第三十六期)

TAG:Android | Android开发 | 编程 |