
Android手勢
//如果不在主線程中創(chuàng)建,則需要 Looper.prepare(),因為內(nèi)部的創(chuàng)建Handler()用于數(shù)據(jù)傳輸需要 Loop,也可以傳一個Handler進去,Handler(Looper.getMainLooper())
gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
// OnContextClickListener
override fun onContextClick(e: MotionEvent?): Boolean {
// 監(jiān)聽外部設(shè)備按鈕
Log.d("Gesture", "onContextClick")
return super.onContextClick(e)
}
//OnDoubleTapListener
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
//當(dāng)發(fā)生雙擊時不會觸發(fā),兩次點擊在300ms(ViewConfiguration.DOUBLE_TAP_TIMEOUT)之內(nèi) ,通過 Handler().sendEmptyMessageDelayed()實現(xiàn)
Log.d("Gesture", "onSingleTapConfirmed")
return super.onSingleTapConfirmed(e)
}
override fun onDoubleTap(e: MotionEvent?): Boolean {
//當(dāng)?shù)诙?action 為 "0-down"的時候就觸發(fā)此方法
Log.d("Gesture", "onDoubleTap")
return super.onDoubleTap(e)
}
override fun onDoubleTapEvent(e: MotionEvent): Boolean {
//二次點擊的Action 變化時會觸發(fā),如果要在 action 為"1-up"的時候處理,就在這個方法里實現(xiàn)邏輯
Log.d("Gesture", "onDoubleTapEvent - ${e.action}")
return super.onDoubleTapEvent(e)
}
//OnGestureListener
override fun onDown(e: MotionEvent?): Boolean {
//按下
Log.d("Gesture", "onDown")
return super.onDown(e)
}
override fun onShowPress(e: MotionEvent?) {
//延時回調(diào) 100(ViewConfiguration.TAP_TIMEOUT)后還是處于 action "0-down"就會觸發(fā)
Log.d("Gesture", "onShowPress")
super.onShowPress(e)
}
override fun onSingleTapUp(e: MotionEvent?): Boolean {
//雙擊時,onDoubleTapUp會觸發(fā),onSingleTapUp會在第一次"down"時觸發(fā)
Log.d("Gesture", "onSingleTapUp")
return super.onSingleTapUp(e)
}
override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {
//快速滑動
Log.d("Gesture", "onScroll")
return super.onScroll(e1, e2, distanceX, distanceY)
}
override fun onLongPress(e: MotionEvent?) {
//長按 500(ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT)后還是處于 action "0-down"就會觸發(fā)
Log.d("Gesture", "onLongPress")
super.onLongPress(e)
}
override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean {
//快速滑動后抬起
Log.d("Gesture", "onFling")
return super.onFling(e1, e2, velocityX, velocityY)
}
})
-
GestureDetector
- 構(gòu)造方法,實際上調(diào)用的都是
GestureDetector(Context context, OnGestureListener listener, Handler handler)其中handler 一般可以不傳,類內(nèi)部會自行創(chuàng)建。Handler用于處理數(shù)據(jù)需要Looper。如果不在主線程中創(chuàng)建
GestureDetector,則在之前執(zhí)行Looper.prepare()或需傳Handler(Looper.getMainLooper()- 監(jiān)聽器
-
OnContextClickListener
API:23, detector.onGenericMotionEvent(MotionEvent)
name description onContextClick 監(jiān)聽外部設(shè)備按鈕 OnDoubleTapListener
detector.onTouchEvent(MotionEvent)
name description onSingleTapConfirmed 當(dāng)發(fā)生雙擊時不會觸發(fā);延時回調(diào),兩次點擊在300ms(ViewConfiguration.DOUBLE_TAP_TIMEOUT)之內(nèi) ,Handler().sendEmptyMessageDelayed() onDoubleTap 當(dāng)?shù)诙?300ms之內(nèi)) action 為 "0-down"的時候就觸發(fā)此方法 onDoubleTapEvent 二次點擊的Action 變化時會觸發(fā),如果要在 action 為"1-up"的時候處理,就在這個方法里實現(xiàn)邏輯 - OnGestureListener
detector.onTouchEvent(MotionEvent)
name description onDown 按下 onShowPress 觸摸, 延時回調(diào) 100(ViewConfiguration.TAP_TIMEOUT)后還是處于 action "0-down"就會觸發(fā),Handler().sendEmptyMessageAtTime() onSingleTapUp 單擊時觸發(fā), 雙擊時onDoubleTapUp會觸發(fā),此時onSingleTapUp會在第一次"down"時觸發(fā),第二次不觸發(fā) onScroll 滑動 onLongPress 長按 500(ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT)后還是處于 action "0-down"就會觸發(fā),Handler().sendEmptyMessageAtTime() onFling 快速滑動后抬起
-
ScaleGestureDetector
private var preScale: Float = 1.0F private var curScale: Float = 1.0F scaleGestureDetector = ScaleGestureDetector(this, object : ScaleGestureDetector.SimpleOnScaleGestureListener() { override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { Log.d( "ScaleGesture", "onScaleBegin: scaleFactor-${detector.scaleFactor} focusX-${detector.focusX} focusY-${detector.focusY}" ) return true } override fun onScale(detector: ScaleGestureDetector): Boolean { //保證連續(xù)性,不處理的話有明顯的抖動 curScale = detector.scaleFactor * preScale if (curScale > 5 || curScale < 0.1) { curScale = preScale return true } testV.scaleY = curScale testV.scaleX = curScale preScale = curScale Log.d( "ScaleGesture", "onScale: scaleFactor-${detector.scaleFactor} focusX-${detector.focusX} focusY-${detector.focusY}" ) return super.onScale(detector) } override fun onScaleEnd(detector: ScaleGestureDetector) { Log.d( "ScaleGesture", "onScaleEnd: scaleFactor-${detector.scaleFactor} focusX-${detector.focusX} focusY-${detector.focusY}" ) } })- 構(gòu)造方法
ScaleGestureDetector(Context context, OnScaleGestureListener listener, Handler handler)同GestureDetector
- 監(jiān)聽器
- OnScaleGestureListener
name description onScaleBegin 縮放手勢開始,返回false時,不使用此次縮放手勢,繼續(xù)回調(diào)onScaleBegin();返回true 則回調(diào) onScale() onScale 觸發(fā)縮放,返回false,繼續(xù)回調(diào)onScale();返回true,回調(diào)onScaleEnd(),這次縮放結(jié)束 onScaleEnd 縮放結(jié)束,在onScale()中返回為true, 或有手指抬起時,觸發(fā)此方法