VelocityTracker를 사용할 때는 오프셋에주의하십시오.
7651 단어 안드로이드VelocityTracker우이
Android에서는 VelocityTracker를 사용하여 작업 속도를 쉽게 계산할 수 있습니다.
자꾸 말하면 다음과 같이 사용합니다.
private var velocityTracker: VelocityTracker? = null
override fun onTouchEvent(event: MotionEvent): Boolean {
val velocityTracker = velocityTracker ?: VelocityTracker.obtain().also { velocityTracker = it }
when (event.action) {
MotionEvent.ACTION_DOWN -> {
velocityTracker.clear()
velocityTracker.addMovement(event)
}
MotionEvent.ACTION_MOVE -> {
velocityTracker.addMovement(event)
}
MotionEvent.ACTION_UP -> {
// 引数はms、1000を渡すとpixel/sの速度が得られる
velocityTracker.computeCurrentVelocity(1000)
val vx = velocityTracker.xVelocity
val vy = velocityTracker.yVelocity
// ここで計算した速度を使って慣性動作させる
velocityTracker.recycle()
this.velocityTracker = null
}
MotionEvent.ACTION_CANCEL -> {
velocityTracker.recycle()
this.velocityTracker = null
}
}
return true
}
View 자체가 움직이는 경우 오프셋 계산 필요
그러나 View 자체가 움직이는 경우에는 오프셋 계산이 필요합니다.
나는 매번 오프셋 계산을 잊고 시간을 낭비하고 있습니다 자주 사용하는 것도 아니고요. .
View의 onTouchEvent나 OnTouchListener의 onTouch에 건네지는 MotionEvent의 좌표는, 그 View의 좌상을 원점으로 하는 상대 좌표계로 변환되고 있습니다. VelocityTracker는 이 상대 좌표를 바탕으로 속도를 계산하므로, 이 터치 조작에 의해 이동하고 있는 View의 MotionEvent를 건네주면, 조작의 이동 속도는 아니고, 터치와 View의 이동의 어긋남만을 주워지기 때문에, 이상한 값이 계산되어 버립니다.
그렇다면 부모 View의 좌표계로 변환하여 VelocityTracker에 전달할까요?
private fun VelocityTracker.addAbsoluteMovement(v: View, event: MotionEvent) {
val dx = v.x
val dy = v.y
event.offsetLocation(dx, dy)
addMovement(event)
event.offsetLocation(-dx, -dy)
}
원시 정보를 바탕으로 절대 좌표로 변환하여 VelocityTracker에 전달해야 합니다.
private fun VelocityTracker.addAbsoluteMovement(event: MotionEvent) {
val dx = event.rawX - event.x
val dy = event.rawY - event.y
event.offsetLocation(dx, dy)
addMovement(event)
event.offsetLocation(-dx, -dy)
}
주의점으로서는, offsetLocation으로 좌표계를 변환했을 경우, 반드시 역변환을 실시해 실행 취소해 둡시다.
이상입니다.
Reference
이 문제에 관하여(VelocityTracker를 사용할 때는 오프셋에주의하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryo_mm2d/items/22730ae29d74cc09929d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
private fun VelocityTracker.addAbsoluteMovement(v: View, event: MotionEvent) {
val dx = v.x
val dy = v.y
event.offsetLocation(dx, dy)
addMovement(event)
event.offsetLocation(-dx, -dy)
}
private fun VelocityTracker.addAbsoluteMovement(event: MotionEvent) {
val dx = event.rawX - event.x
val dy = event.rawY - event.y
event.offsetLocation(dx, dy)
addMovement(event)
event.offsetLocation(-dx, -dy)
}
Reference
이 문제에 관하여(VelocityTracker를 사용할 때는 오프셋에주의하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryo_mm2d/items/22730ae29d74cc09929d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)