最近有个需求,监听Scrollow的滑动方向,找了大半天,大部分的滑动方向监听都是在OnTouch方法里监听手指抬起时间,根据坐标位置来判断方向,与我的需求有点不符合,我需要连续监听滑动方向,即使手指不抬起也要监听滑动方向。
废话不多说,直接说原理,监听手势,在onCroll方法里判断坐标方向,根据坐标方向判断手指滑动方向,上代码(Kotlin)
package com.example.powermap
import android.util.Log
import android.view.GestureDetector
import android.view.MotionEvent
import kotlin.math.abs
internal class GestureListener : GestureDetector.OnGestureListener {
private var tempY = 0f
private var lastMoveTime = 0L
override fun onDown(motionEvent: MotionEvent?): Boolean {
Log.d("TAG", "onDown:按下")
tempY = 0f
return false
}
override fun onShowPress(motionEvent: MotionEvent?) {
Log.d("TAG", "onShowPress:手指按下一段时间,不过还没到长按")
}
override fun onSingleTapUp(motionEvent: MotionEvent?): Boolean {
Log.d("TAG", "onSingleTapUp:手指离开屏幕的一瞬间")
return false
}
override fun onScroll(motionEvent: MotionEvent?, motionEvent1: MotionEvent?, v: Float, v1: Float): Boolean {
if (tempY != 0f) {
if (System.currentTimeMillis() - lastMoveTime > 200) {
if (abs(v1) > abs(tempY)) {
Log.e("TAG", "下滑 $v1 $tempY")
} else if((abs(v1) < abs(tempY))) {
Log.e("TAG", "上滑 $v1 $tempY")
}
lastMoveTime = System.currentTimeMillis()
}
}
if (lastMoveTime == 0L) {
lastMoveTime = System.currentTimeMillis()
}
tempY = v1
return false
}
override fun onLongPress(motionEvent: MotionEvent?) {
Log.d("TAG", "onLongPress:长按并且没有松开")
}
override fun onFling(motionEvent: MotionEvent?, motionEvent1: MotionEvent?, v: Float, v1: Float): Boolean {
Log.d("TAG", "onFling:迅速滑动,并松开")
return false
}
}