Android手勢識別類 GestureDetector

jopen 10年前發布 | 29K 次閱讀 Android Android開發 移動開發

為了加強鼠標響應事件,Android提供了GestureDetector手勢識別類。通過GestureDetector.OnGestureListener來獲取當前被觸發的操作手勢(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具體包括以下幾種:

boolean  onDoubleTap(MotionEvent e)
解釋:雙擊的第二下Touch down時觸發
boolean  onDoubleTapEvent(MotionEvent e)
解釋:雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。
boolean  onDown(MotionEvent e)
解釋:Touch down時觸發
boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
解釋:Touch了滑動一點距離后,up時觸發。
void  onLongPress(MotionEvent e)
解釋:Touch了不移動一直Touch down時觸發
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
解釋:Touch了滑動時觸發。
void  onShowPress(MotionEvent e)
解釋:Touch了還沒有滑動時觸發
(與onDown,onLongPress比較
onDown只要Touch down一定立刻觸發。
而Touchdown后過一會沒有滑動先觸發onShowPress再是onLongPress。
所以Touchdown后一直不滑動,onDown->onShowPress->onLongPress這個順序觸發。
boolean  onSingleTapConfirmed(MotionEvent e)
boolean  onSingleTapUp(MotionEvent e)
解釋:上面這兩個函數都是在touch down后又沒有滑動(onScroll),又沒有長按(onLongPress),然后Touchup時觸發。

點擊一下非常快的(不滑動)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
點擊一下稍微慢點的(不滑動)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

 

 

用一個圖片切換的例子來說明手勢識別類的使用。

java代碼:

    package com.lovo;  

    import android.app.Activity;  
    import android.os.Bundle;  
    import android.view.GestureDetector;  
    import android.view.GestureDetector.OnGestureListener;  
    import android.view.MotionEvent;  
    import android.widget.ImageView;  
    /**  
     * 手勢識別類  
     * 圖片切換顯示,實現接口OnGestureListener  
     * @author Administrator  
     *  
     */  
    public class MyGestrueTest extends Activity implements OnGestureListener{  
        /**手勢管理器*/  
        private GestureDetector detector;  
        /**圖片資源數組*/  
        private int [] imageId;  

        /**圖片視圖*/  
        private ImageView imageView ;  
        private ImageView[] imgView;  

        /**圖片下標計數器*/  
        private int count=0;  

        @Override  
        protected void onCreate(Bundle savedInstanceState) {  

            super.onCreate(savedInstanceState);  
            setContentView(R.layout.my_gesture_test);  
            //創建手勢管理器  
            detector = new GestureDetector(this);  
            //得到圖片視圖  
            imageView=(ImageView) findViewById(R.id.image_gestrue);  

            //得到圖片資源的Id  
            imageId = new int[]{  
                    R.drawable.whatsnew_fornew_01,  
                    R.drawable.whatsnew_fornew_02,  
                    R.drawable.whatsnew_fornew_03,  
                    R.drawable.whatsnew_fornew_04,  
                    R.drawable.whatsnew_fornew_05};  
            //得到圖片視圖 ImageView  
             imgView = new ImageView []{  
                    (ImageView) findViewById(R.id.small_image1),  
                    (ImageView) findViewById(R.id.small_image2),  
                    (ImageView) findViewById(R.id.small_image3),  
                    (ImageView) findViewById(R.id.small_image4),  
                    (ImageView) findViewById(R.id.small_image5)};  

        }  
        @Override  
        public boolean onTouchEvent(MotionEvent event) {  
            //將touch事件交給手勢管理器來處理  
            return detector.onTouchEvent(event);  
        }  
        @Override  
        public boolean onDown(MotionEvent e) {  
            return false;  
        }  
        /**  
         * 手勢滑動觸發的事件  
         */  
        @Override  
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
                float velocityY) {  
            //從右往左移動  
            if(e1.getX()-e2.getX()>50){  
                //下標++            
                count++;              
                if(count<=4){  
                    //切換到下一張  
                    imageView.setImageResource(imageId[count]);  
                    //設置該張對應的高亮小圖標  
                    imgView[count].setImageResource(R.drawable.page_indicator_focused);  
                    //其他小圖標均為非高亮  
                    imgView[count-1].setImageResource(R.drawable.page_indicator_unfocused);  
                }else{  
                    //滑動到最后一張,該方向不會再滑動,就停留在最后一張  
                    count=4;  
                    imageView.setImageResource(imageId[count]);               
                }  
            }  
            //從左往右移動  
            if(e1.getX()-e2.getX()<50){  

                count--;  

                if(count>=0){  
                    imageView.setImageResource(imageId[count]);  
                    imgView[count].setImageResource(R.drawable.page_indicator_focused);  
                    imgView[count+1].setImageResource(R.drawable.page_indicator_unfocused);  
                }else{  
                    count=0;  
                    imageView.setImageResource(imageId[count]);  
                }  
            }  
            return false;  
        }  

        @Override  
        public void onLongPress(MotionEvent e) {}  
        @Override  
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
                float distanceY) {  
            return false;  
        }  
        @Override  
        public void onShowPress(MotionEvent e) {}  
        @Override  
        public boolean onSingleTapUp(MotionEvent e) {  
            return false;  
        }  
    }  


 

XML:

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"   
    android:background="#000">  
    <LinearLayout  
        android:id="@+id/my_geture_test_1"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent" >  

        <ImageView  
            android:id="@+id/image_gestrue"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:src="@drawable/whatsnew_fornew_01" >  
        </ImageView>  
    </LinearLayout>  

    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_alignParentBottom="true"        
        android:gravity="center_horizontal"   
        android:layout_marginBottom="30dp"     
        >  
        <ImageView  
            android:id="@+id/small_image1"  
            android:padding="5dp"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:src="@drawable/page_indicator_focused"   
            >  
        </ImageView>  

        <ImageView  
            android:id="@+id/small_image2"  
            android:padding="5dp"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:src="@drawable/page_indicator_unfocused" >  
        </ImageView>  

        <ImageView  
            android:id="@+id/small_image3"  
            android:padding="5dp"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:src="@drawable/page_indicator_unfocused" >  
        </ImageView>  

        <ImageView  
            android:id="@+id/small_image4"  
            android:padding="5dp"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:src="@drawable/page_indicator_unfocused" >  
        </ImageView>  
        <ImageView  
            android:id="@+id/small_image5"  
            android:padding="5dp"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:src="@drawable/page_indicator_unfocused" >  
        </ImageView>  
    </LinearLayout>  
</RelativeLayout>  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!