Android之Gesture

Gesture手勢
 
View類有個View.OnTouchListener內部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些複雜的手勢,用這個接口就會很麻煩(因爲我們要自己根據用戶觸摸的軌跡去判斷是什麼手勢)
Android sdk給我們提供了GestureDetector(Gesture:手勢Detector:識別)類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。雖然他能識別手勢,但是不同的手勢要怎麼處理,應該是提供給程序員實現的,因此這個類對外提供了兩個接口:OnGestureListener,OnDoubleTapListener,還有一個內部類SimpleOnGestureListener,SimpleOnGestureListener類實現了上述兩個接口,一個更方便的響應不同手勢的類,這個類中所有的方法體都是空的,該類是static class,也就是說它實際上是一個外部類。程序員可以在外部繼承這個類,重寫裏面的手勢處理方法。
通過GestureDetector的構造方法可以將SimpleOnGestureListener對象傳遞進去,這樣GestureDetector能處理不同的手勢了。當我們接收到用戶觸摸消息時,將這個消息交給GestureDetector去加工,我們通過設置偵聽器獲得GestureDetector處理後的手勢.
具體用法:
1.寫一個類繼承SimpleOnGestureListener重寫需要的方法,
2.在需要手勢的view或Activity中實例化一個GestureDetector類的對象(構造方法中有個參數就是你寫的SimpleOnGestureListener子類的對象)
3.在ontouch()方法中返回myGestureDetector.onTouchEvent(event);
 
OnGestureListener的接口有這幾個:

abstract boolean onDown(MotionEvent e); // 單擊,觸摸屏按下時立刻觸發

abstract boolean onSingleTapUp(MotionEvent e); // 擡起,手指離開觸摸屏時觸發(長按、滾動、滑動時,不會觸發這個手勢)

abstract void onShowPress(MotionEvent e); // 短按,觸摸屏按下後片刻後擡起,會觸發這個手勢,如果迅速擡起則不會

abstract void onLongPress(MotionEvent e); // 長按,觸摸屏按下後既不擡起也不移動,過一段時間後觸發

abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); // 滾動,觸摸屏按下後移動

abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); // 滑動,觸摸屏按下後快速移動並擡起,會先觸發滾動手勢,跟着觸發一個滑動手勢
 
OnDoubleTapListener的接口有這幾個:

abstract boolean onDoubleTap(MotionEvent e); // 雙擊,手指在觸摸屏上迅速點擊第二下時觸發

abstract boolean onDoubleTapEvent(MotionEvent e); // 雙擊的按下跟擡起各觸發一次

abstract boolean onSingleTapConfirmed(MotionEvent e); // 單擊確認,即很快的按下並擡起,但並不連續點擊第二下
 
View必須設置longClickable爲true,否則手勢識別無法正確工作,只會返回Down, Show, Long三種手勢
必須在View的onTouchListener中調用手勢識別,而不能像Activity一樣重載onTouchEvent,否則同樣手勢識別無法正確工作 ,即:應該爲:
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
});
 
單擊:down 0, single up 1, single conf 0
短按:down 0, show 0, single up 1
長按:down 0, show 0, long 0
雙擊:down 0, single up 1, double 0, double event 0, down 0, double event 1
滾動:down 0, (show 0), scrool 2...
滑動:down 0, (show 0), scrool 2..., fling 1
 
 
例子:
1.通過手勢來指引小球的位置  小球手指跟隨  可以不用手勢  控制小球移動 要用手勢
   onDraw(Canvas canvas) : Paint paint = new Paint();  
             paint.setColor(Color.BLUE);  
             canvas.drawCircle(x1, y1, 10, paint);  
 
2.通過手勢與ViewFilpper結合使用來達到點擊或滑動切換界面效果
ViewFilpper:
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ViewAnimator
android.widget.ViewFlipper
 
被添加到ViewFlipper中的兩個或兩個以上的視圖之間將執行一個簡單的ViewAnimator動畫。一次僅能顯示一個子視圖。如果需要,可以設置間隔時間使子視圖像幻燈片一樣自動顯示。
android:autoStart
當設爲true時,自動啓動動畫
此時必須是一個布爾值,屬性值爲true或false
(對應於全局資源屬性R.attr.autoStart)
android:flipInterval
顯示下一個視圖的時間間隔
 
public bool isAutoStart ()
如果視圖顯示到窗口上時會自動調用startFlipping()方法,則返回true
public bool isFlipping()
如果子視圖正在切換,則返回true
public bool setAutoStart (bool autoStart)
設置視圖顯示到窗口上時是否會自動調用startFlipping()方法
public bool setFlipInterval (int milliseconds)
視圖間切換的時間間隔
參數
milliseconds 毫秒數
public bool startFlipping ()
開始在子視圖間定時循環切換
public bool stopFlipping ()
停止切換
 mFlipper.setInAnimation(inFromRightAnimation());  
mFlipper.setOutAnimation(outToLeftAnimation());  
 mFlipper.showPrevious();
   mFlipper.showNext();  

發佈了14 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章