Android 手勢介紹

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

    1. 構(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()

    1. 監(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}"
               )
           }
       })
    
    
    1. 構(gòu)造方法

    ScaleGestureDetector(Context context, OnScaleGestureListener listener, Handler handler)

    同GestureDetector

    1. 監(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ā)此方法

資源

例子

Android開發(fā)藝術(shù)探索 - 任玉剛

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容