Androidユーザージェスチャー検出

24000 ワード

AndroidはGestureDetectorクラスを提供し、このクラスを通じて多くのジェスチャーを識別することができ、彼のonTouchEvent(event)方法によって異なるジェスチャー識別を完成した.
GestureDetectorこのクラスは対外的に2つのインタフェースと1つの外部クラスを提供しています
インタフェース:OnGestureListener,OnDoubleTapListener
:1番目のインタフェースはジェスチャーを処理し、2番目のインタフェースはクリックまたはダブルクリックを処理します.
内部クラス:SimpleOnGestureListene
:この外部クラスはインタフェースのすべての関数の統合であり、彼はこの2つのインタフェースのすべての実現が必要な関数を含み、書き換えを行ったが、すべてのメソッドは空である.このクラスはstatic classで、プログラマーは外部でこのクラスを継承し、中のジェスチャー方法を書き換えることができます.
1、インタフェースの使用
次のように使用します.
public class GestureListener implements GestureDetector.OnGestureListener ,
    GestureDetector.OnDoubleTapListener{

    private static final String TAG = "GestureListener";

    //           ;
    @Override
    public boolean onDown(MotionEvent e) {
        Log.e(TAG, "onDown:         " );
        return false;
    }

    //      ,              
    @Override
    public void onShowPress(MotionEvent e) {
        Log.e(TAG, "onShowPress:     ,         " );
    }

    //          ,       
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.e(TAG, "onSingleTapUp:        " );
        return false;
    }


    /**
     *       ,   

     * @param distanceX x      
     * @param distanceY y      
     */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.e(TAG, "onScroll:       ,   " );
        return false;
    }

    //       ,
    @Override
    public void onLongPress(MotionEvent e) {
        Log.e(TAG, "onLongPress:     " );
    }

   
    /**
     *       ,       ,
     * @param e1     event
     * @param e2     event
     * @param velocityX x              
     * @param velocityY y              
     */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.e(TAG, "onFling:       ,       ," );
        return false;
    }



    //    ,
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.e(TAG, "onSingleTapConfirmed:   " );
        return false;
    }

    //      
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.e(TAG, "onDoubleTap:   " );
        return false;
    }
    //            
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.e(TAG, "onDoubleTapEvent:       " );
        return false;
    }

}

上記の2つのインタフェースはすべての方法を書き換え、注釈はすでに方法に書かれています.
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //   gestureDetector   ,   onGestureListener    
        mGestureDetector = new GestureDetector(new GestureListener());

        CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
        //    
        controlBar.setOnTouchListener(this);
        //    
        controlBar.setFocusable(true);
        //           
        controlBar.setClickable(true);
        //           
        controlBar.setLongClickable(true);

    }
    /**
     *      GestureDetector   onTouchEvent()  ,      MotionEvent    GestureDetector
     *            callback           
     */
    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }

カスタムビューのジェスチャー検出を行いました.ジェスチャー検出のインタフェースとダブルクリックのインタフェースが実装されており、使用可能
2、内部クラスの使用
内部クラスを使用する方法は、状況に応じて、その方法でその方法を書き換えることができます.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //   gestureDetector            ,         
    mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
        final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            //   :          
            if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
                Log.e(TAG, "onFling:   "+e1.getX()+"------"+e2.getX() );
            }else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
                Log.e(TAG, "onFling:    "+e1.getX()+"------"+e2.getX()  );
            }
            return false;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.e(TAG, "onDoubleTapEvent:   " );
            return false;
        }
    });

    CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
    //    
    controlBar.setOnTouchListener(this);
    //    
    controlBar.setFocusable(true);
    //           
    controlBar.setClickable(true);
    //           
    controlBar.setLongClickable(true);

}

/**
 *      GestureDetector   onTouchEvent()  ,      MotionEvent    GestureDetector
 *            callback           
 */
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}

参考記事:https://blog.csdn.net/harvic880925/article/details/39520901