Android学習のジェスチャー

6556 ワード

Gesture DetectorとSimpleOnGesture Listenerの使用教程
--レス:http://www.cnblogs.com/transmuse/archive/2010/12/02/1894833.html
1.ユーザーがスクリーンにタッチすると、たくさんのジェスチャーが生まれます。例えば、ダウンタウン、up、scroll、filingなど。View類にはView.OnTouch Listener内部インターフェースがあります。彼のontouch(View、MotionEvent)方法を書き換えることで、いくつかのtouchイベントを処理できます。このインターフェースを使うと大変です。(私たちはユーザーのタッチの軌跡からどのジェスチャーかを判断します。)Android sdkは私たちにGesture Detector(Gestureジェスチャー:Detector:識別)類を提供してくれました。この種類を通じて多くのジェスチャーを識別できます。主に彼のonTouchEvent(event)方法によって異なるジェスチャーの識別ができました。彼はジェスチャーを識別することができますが、さまざまなジェスチャーはどのように処理しますか?プログラマに提供するべきです。このタイプは外部に二つのインターフェースを提供しています。OnGesture Listener、Onub TapListener、もう一つの内部種類のSimpleOnGesture Listener、SimpleOnGesture Listener類はGesture Listenerであります。このクラスは上述の二つのインターフェースを実現しています。このクラスはstatic classで、つまり外部クラスです。プログラマは外部でこのクラスを継承し、中のジェスチャー処理方法を書き換えることができます。
Gesture Detectorの構造方法でSimpleOnGesture Listenerオブジェクトを送ることができます。このようにGesture Detectorは異なるジェスチャーを扱うことができます。
2.具体的な使い方:
2.1  

private class DefaultGestureListener extends SimpleOnGestureListener{
 
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }
 
        @Override
        public void onLongPress(MotionEvent e) {
            
        }
        /**
         * @param e1 The first down motion event that started the scrolling.
           @param e2 The move motion event that triggered the current onScroll.
           @param distanceX The distance along the X axis( ) that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
           @param distanceY The distance along the Y axis that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
                              view,          ,       ,     ACTION_MOVE            GestureDetector onTouchEvent    
         * */
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            return false;
        }
        /**
         * @param e1  1 ACTION_DOWN MotionEvent       
         * @param e2     ACTION_MOVE MotionEvent 
         * @param velocityX X       ,  /   
         * @param velocityY Y       ,  / 
         *        ACTION_UP        GestureDetector onTouchEvent    
         * 
         * */
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            return false;
        }
 
        @Override
        public void onShowPress(MotionEvent e) {
            
        }
        @Override
        public boolean onDown(MotionEvent e) {
            return false;
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return false;
        }
        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            return false;
        }
        /**
         *        onSingleTapUp,   GestureDetector             ,            ,     “  ”     
         * */
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            return false;
        }
        
    }
 
2.2  public Gesture Detector(Contect context、Gesture Detector.OnGesture Listener listener)は、構造方法によりジェスチャー応答を識別クラスに渡す。
2.3  OnTouch Listenerのontouch方法で

 
private OnTouchListener gestureTouchListener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gDetector.onTouchEvent(event);
        }
    };
 
OK、これで終わりです。
遭遇した問題:
1.オンフライ(***)はトリガできません。
     mListView.set LongClicableを設定することにより;はい、(私が処理したのはListViewのジェスチャーイベントです)。このようにしてこそ、Tapとは異なるhold(ACTION NuMOVE)を扱うことができます。また、layout定義のAndroid:longClicableでもできます。
2.ユーザーが携帯画面を長押しすると、イベントを長押しするため、画面を離れると、upイベントが発生しますが、Simple OnGesture ListenerはlongPressイベントのupイベントに対してインターフェースを提供していません。
解決策:
このように、キャプチャupイベントは、すべてOnTouch Listenerが先に獲得し、その後Simple OnGesture Listenerに渡されるので、ここで注意しなければならないことがあります。
upイベントをキャプチャした後、このイベントをSimple OnGesture Listenerに処理しなければなりません。私たちは事件のupを長い押すだけですが、SimpleOnGesture Listenerは長押しイベントのupに対してもいくつかの処理を行いました。対外にインターフェースを提供していません。
何をしましたか?

 
if (mInLongPress) {
                mHandler.removeMessages(TAP);
                mInLongPress = false;
 
}
Simple OnGesture Listenerに任せないと、クリック動作もonLongPressメソッドをトリガします。

private OnTouchListener gestureTouchListener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return gDetector.onTouchEvent(event);
           case MotionEvent.ACTION_UP:
                MyGesture.FlagInfo info = mGesture.getFlagInfo();
                if(info.isConnected==true){
                    int firstVisiblePosition = mListView.getFirstVisiblePosition();
                    View view = mListView.getChildAt(info.position-firstVisiblePosition);
                    if(view!=null){
                        view.setBackgroundResource(R.drawable.listitem_background_blue);
                        info.isConnected = false;
                    }
                }
                return gDetector.onTouchEvent(event);
            case MotionEvent.ACTION_MOVE:
                return gDetector.onTouchEvent(event);
            }
            return false;
            
        }
    };
まとめ:
1.画面上の実行フローをクリックします。  二つの場合があります。一つは時間が短いこと、一つは時間が長いことです。
時間は短いです。ondown-------onSingleTapUp-------onSingleTapConfirmed
時間はちょっと長いです。ondown---------'onShow Press---'onSingleTapUp-----'onSingleTapConfirmed
2.長押し事件
ondown-----』onShow Press-----onLongPress
3.スロー:スクリーンに指を触れたら、少しスライドしたらすぐに放します。
on Down---』onScrroll---"onScrroll---"onScrroll----------->onFling
4.ドラッグ
ondown------onScrroll-------onScrroll-----onFiling
注意:ワンフィンリングをトリガする場合がありますが、トリガしない場合があります。