Android 提供瞭GestureDetector類來識別用戶的手勢操作,這個類提供瞭兩個偵聽接口:OnGestureListener(處理單擊類消息)與OnDoubleTagListener(處理雙擊類消息)。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);
接口GestureListener的實現類:
package com.example.android_gester_demo; import android.util.Log; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; public class MyGesture implements OnGestureListener{ public MyGesture( ){ } @Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub Log.i("----onDown-----", "--down"); return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub Log.i("------onFling----", "--fling"); return false; } @Override public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub Log.i("-------onLongPoress-----", "--longpress"); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub Log.i("-------onScroll------", "--scroll"); return false; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub Log.i("------onShowPress-----", "--showPress"); } @Override public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub Log.i("------onSingleTagUp-------", "--singleUp"); return false; } }
測試Activity
package com.example.android_gester_demo; import android.os.Bundle; import android.app.Activity; import android.view.GestureDetector; import android.view.Menu; import android.view.MotionEvent; public class MainActivity extends Activity { private GestureDetector detector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); detector = new GestureDetector(this, new MyGesture()); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return detector.onTouchEvent(event); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
單擊時打印情況:(動作:按下馬上抬起)
短點擊時打印情況:(動作:按下停留片刻再抬起)
長點擊打印情況:(動作:按下停留稍長時間再抬起)
滾動時打印情況:(動作:按下—向屏幕上方(或下左右)移動—松手,屏幕不動)
滑動時打印情況:(動作:按下—-向屏幕上方(或下左右)移動—松手,讓屏幕在慣性下自己滑動一段距離)vcD4KPHA+PGltZyBzcmM9″/uploadfile/Collfiles/20131228/2013122809123053.jpg” alt=”\”>
總結:不論何種手勢發生的時候,down事件總是第一個發生的。
滾動與滑動的最大區別在於,前者是在手指的“驅使”下運動的,手指離開界面後,滾動即停止;而後者開始也是在手指的“驅使”下運動的,手指離開界面後,屏幕會在慣性驅使下再滑動一段距離。