Android Gesture
Table of contents
Android Gesture是用來偵測、處理手勢的相關動作,像是手指頭在螢幕畫出圖案,大部份的應用是拿來偵測上下或左右滑過螢幕(swipe), 如果不需要處理特別的手勢,那通常用GestureDetector相關的類別即可。
幾個主要的類別是:
- android.view.GestureDetector 偵測手勢
- android.view.GestureDetector.OnGestureListener 處理Gesture事件
- android.view.GestureDetector.OnDoubleTapListener 處理double-tap(雙擊)事件
- android.view.GestureDetector.SimpleOnGestureListener 一個基本的Gesture Listener實作,直接extneds這個類別可以不用實作一堆OnGestureListener,OnDoubleTapListener用不著的methods
- android.view.View.OnTouchListener 用來把View上所發生的事件傳給GestureDetector
處理多點觸控的相關類別是:
- android.view.ScaleGestureDetector
- android.view.OnScaleGestureListener
- android.view.SimpleOnScaleGestureListener
public class MyActivity extends Activity {
private GestureDetector detector;
private WebView myWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
detector = new GestureDetector(new MyOnGestureListener());
myWebView.setOnTouchListener(new MyOnTouchListener());
}
class MyOnGestureListener implements OnGestureListener {
@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() > 200) { //swipe left,如果向左滑動的距離超過200才執行
} else if (e2.getX() - e1.getX() > 200) { // 如果向向滑動的距離超過200才執行
}
return true;
}
@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;
}
}
class MyOnTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
return detector.onTouchEvent(event);
}
}
}
使用上比較需要注意的是OnTouchListener,這個要設定到你操作的元件上,本例中,Activity上面是整個被WebView(myWebView)佔住了 ,所以所有的手勢操作是發生在WebView上而不是Activity,所以必須把WebView的TouchEvent傳給detector
上面的MyOnGestureListener可以用下面的這個MySimpleOnGestureListener取代,可以不用實作一堆空methods
class MySimpleOnGestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX() - e2.getX() > 200) { //swipe left,如果向左滑動的距離超過200才執行
} else if (e2.getX() - e1.getX() > 200) { // 如果向向滑動的距離超過200才執行
}
return true;
}
}