在App要顯示或隱藏 UI時,直接切換顯示的內容,可能會讓使用者覺得畫面突然變化太大。Reveal animation 動畫可提供使用者視覺上的連續性,減緩變化並引起使用者的注意。
步驟:
1.點下Fab時,取得Fab的x,y座標,開啟第二頁。
2.第二頁從第一頁傳來的Fab座標開啟Reveal 動畫
第一頁
fab.setOnClickListener { v ->
val location = IntArray(2)
//取得fab的x, y座標
v.getLocationOnScreen(location)
val revealX = location[0]
val revealY = location[1]
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, v, "Transition")
//傳入fab的x, y座標
val intent = Intent(this, RevealEffectActivity::class.java)
intent.putExtra(RevealEffectActivity.ARG_CIRCULAR_REVEAL_X, revealX)
intent.putExtra(RevealEffectActivity.ARG_CIRCULAR_REVEAL_Y, revealY)
ActivityCompat.startActivity(this, intent, options.toBundle())
}
第二頁
從第一頁傳來的Fab座標開啟Reveal 動畫
private fun startReveal(centerX: Int, centerY: Int) {
//動畫的開始半徑
val startRadius = 0.0f
//動畫的結束半徑
val endRadius = Math.max(rootLayout.width, rootLayout.height).toFloat()
val circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, centerX, centerY, startRadius, endRadius)
circularReveal.duration = 400
circularReveal.interpolator = AccelerateInterpolator()
rootLayout.visibility = View.VISIBLE
circularReveal.start()
}
ViewAnimationUtils.createCircularReveal參數
view View: 執行Reveal 動畫的View
centerX int: 相對於View,動畫圓心的x坐標
centerY int: 相對於View,動畫圓心的y坐標
startRadius float: 動畫的開始半徑
endRadius float: 動畫的結束半徑
完整程式:
https://github.com/evanchen76/RevealEffect
參考:
https://developer.android.com/training/animation/reveal-or-hide-view