2020年5月21日木曜日

VelocityTracker の使い方

VelocityTracker はタッチイベントの速度計算を簡単にするためのクラスです。Fling など速度がジェスチャーの構成要素になっているものに対して便利です。

VelocityTracker.obtain() でインスタンスを取得します。
addMovement(ev) で MotionEvent を追加し、速度を取得するときは computeCurrentVelocity(int units) または computeCurrentVelocity(int units, float maxVelocity) を呼んだ後に getXVelocity(), getYVelocity() を呼びます。
obtain() で取得したインスタンスは不要になった時点で recycle() を呼びましょう。

computeCurrentVelocity() で maxVelocity を渡さない場合は Float.MAX_VALUE が使われます。 computeCurrentVelocity() で渡す units は getXVelocity(), getYVelocity() で取得する velocity の単位になります。1 を指定した場合は pixels per millisecond、1000 を渡した場合は pixels per second になります。
  1. class SimpleDragView : FrameLayout {  
  2.   
  3.     constructor(context: Context) : super(context)  
  4.     constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)  
  5.     constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(  
  6.         context,  
  7.         attrs,  
  8.         defStyleAttr  
  9.     )  
  10.   
  11.     private val targetView: View  
  12.   
  13.     private var velocityTracker: VelocityTracker? = null  
  14.   
  15.     init {  
  16.         val size = (100 * resources.displayMetrics.density).toInt()  
  17.         targetView = View(context).apply {  
  18.             layoutParams = LayoutParams(size, size).apply {  
  19.                 gravity = Gravity.CENTER  
  20.             }  
  21.             setBackgroundColor(Color.RED)  
  22.         }  
  23.         addView(targetView)  
  24.     }  
  25.   
  26.     private var lastVelocityX = 0f  
  27.     private var lastVelocityY = 0f  
  28.   
  29.     override fun onTouchEvent(ev: MotionEvent): Boolean {  
  30.         when (ev.actionMasked) {  
  31.             MotionEvent.ACTION_DOWN -> {  
  32.                 velocityTracker?.clear()  
  33.                 velocityTracker = velocityTracker ?: VelocityTracker.obtain()  
  34.                 velocityTracker?.addMovement(ev)  
  35.             }  
  36.             MotionEvent.ACTION_MOVE -> {  
  37.                 velocityTracker?.let {  
  38.                     it.addMovement(ev)  
  39.                     val pointerId: Int = ev.getPointerId(ev.actionIndex)  
  40.                     it.computeCurrentVelocity(1000)  
  41.                     lastVelocityX = it.getXVelocity(pointerId)  
  42.                     lastVelocityY = it.getYVelocity(pointerId)  
  43.                 }  
  44.             }  
  45.             MotionEvent.ACTION_UP -> {  
  46.                 velocityTracker?.let {  
  47.                     ObjectAnimator  
  48.                         .ofPropertyValuesHolder(  
  49.                             targetView,  
  50.                             PropertyValuesHolder.ofFloat(  
  51.                                 View.TRANSLATION_X,  
  52.                                 lastVelocityX / 4  
  53.                             ),  
  54.                             PropertyValuesHolder.ofFloat(  
  55.                                 View.TRANSLATION_Y,  
  56.                                 lastVelocityY / 4  
  57.                             )  
  58.                         )  
  59.                         .apply {  
  60.                             addListener(object : AnimatorListenerAdapter() {  
  61.                                 override fun onAnimationEnd(animation: Animator?) {  
  62.                                     super.onAnimationEnd(animation)  
  63.                                     targetView.translationX = 0f  
  64.                                     targetView.translationY = 0f  
  65.                                 }  
  66.                             })  
  67.                         }  
  68.                         .setDuration(500)  
  69.                         .start()  
  70.                 }  
  71.   
  72.                 velocityTracker?.recycle()  
  73.                 velocityTracker = null  
  74.             }  
  75.             MotionEvent.ACTION_CANCEL -> {  
  76.                 velocityTracker?.recycle()  
  77.                 velocityTracker = null  
  78.             }  
  79.         }  
  80.         return true  
  81.     }  
  82. }  



0 件のコメント:

コメントを投稿