利用觸摸屏的Fling、Scroll等Gesture(手勢)操作來操作會使得應用程序的用戶體驗大大提升,比如用Scroll手勢在 瀏覽器中滾屏,用Fling在閱讀器中翻頁等。在Android系統中,手勢的識別是通過 GestureDetector.OnGestureListener接口來實現的,舉例說明:
- public class ActivityMain extends Activity implements GestureDetector.OnGestureListener {
- GestureDetector detector;
- /**
- * Called when the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //構造GestureDetector;Context context, OnGestureListener listener
- detector = new GestureDetector(this, this);
- detector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
- //短快的點擊算一次單擊
- @Override
- public boolean onSingleTapConfirmed(MotionEvent e) {
- System.out.println("onSingleTapConfirmed");
- return false;
- }
- //雙擊時產生一次
- @Override
- public boolean onDoubleTap(MotionEvent e) {
- System.out.println("onDoubleTap");
- return false;
- }
- //雙擊時產生兩次
- @Override
- public boolean onDoubleTapEvent(MotionEvent e) {
- System.out.println("onDoubleTapEvent");
- return false;
- }
- });
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return detector.onTouchEvent(event);
- }
- // 用戶輕觸觸摸屏,由1個MotionEvent ACTION_DOWN觸發
- @Override
- public boolean onDown(MotionEvent e) {
- System.out.println("onDown");
- return false;
- }
- // 用戶輕觸觸摸屏,尚未鬆開或拖動,由一個1個MotionEvent ACTION_DOWN觸發
- // 注意和onDown()的區別,強調的是沒有鬆開或者拖動的狀態
- @Override
- public void onShowPress(MotionEvent e) {
- }
- //用戶(輕觸觸摸屏後)鬆開,由一個1個MotionEvent ACTION_UP觸發
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- System.out.println("onSingleTapUp");
- return false;
- }
- // 用戶按下觸摸屏,並拖動,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE觸發
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
- System.out.println("onScroll");
- return false;
- }
- // 用戶長按觸摸屏,由多個MotionEvent ACTION_DOWN觸發
- @Override
- public void onLongPress(MotionEvent e) {
- System.out.println("onLongPress" + e.getEventTime());
- }
- //用戶按下觸摸屏、快速移動後鬆開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
- System.out.println("onFling: " + (e1.getX() - e2.getX()) + " " + (e1.getY() - e2.getY()) + " " + velocityX + " " + velocityY);
- System.out.println(e1.getY());
- return false;
- }
- }