メモ:ScrollViewではGestureDetectorが動かずはまってしまった。LinearLayoutでは問題なく動作した。
Androidでフリックイベントを取得する
// Y軸最低スワイプ距離
private val SWIPE_MIN_DISTANCE = 50
// Y軸最低スワイプスピード
private val SWIPE_THRESHOLD_VELOCITY = 200
// X軸の移動距離 これ以上なら縦移動を判定しない
private val SWIPE_MAX_OFF_PATH = 200
// タッチイベントを処理するためのインタフェース
private var mGestureDetector: GestureDetector? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity)
mGestureDetector = GestureDetector(this, mOnGestureListener) // => 忘れない
}
// タッチイベント
override fun onTouchEvent(event: MotionEvent): Boolean {
return mGestureDetector!!.onTouchEvent(event)
}
// タッチイベントのリスナー
private val mOnGestureListener = object : GestureDetector.SimpleOnGestureListener() {
// フリックイベント
override fun onFling(event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
try {
// 移動距離・スピードを出力
val distance_y = Math.abs(event1.y - event2.y)
val velocity_y = Math.abs(velocityY)
Log.d("onFling", "縦の移動距離:$distance_y 縦の移動スピード:$velocity_y" )
// X軸の移動距離が大きすぎる場合
if (Math.abs(event1.x - event2.x) > SWIPE_MAX_OFF_PATH) {
Log.d("onFling","横の移動距離が大きすぎます")
// 開始位置から終了位置の移動距離が指定値より大きい
// Y軸の移動速度が指定値より大きい
} else if (event2.y - event1.y > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Log.d("onFling","上から下")
// 終了位置から開始位置の移動距離が指定値より大きい
// Y軸の移動速度が指定値より大きい
} else if (event1.y - event2.y > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Log.d("onFling","下から上")
}
} catch (e: Exception) {
// TODO
}
return false
}
// 長押し
override fun onLongPress(e: MotionEvent?) {
super.onLongPress(e)
}
}
参考
以下の記事を参考にさせて頂きました。
- [Android開発 フリックイベントを取得する] (http://takeshiyako.blogspot.jp/2015/08/android-flick-input-event.html)