爲了加強鼠標響應事件,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
使用GestureDetector需要在View中重寫onTouchEvent事件,例如:
- GestureDetector mGesture = null;
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
- // TODO Auto-generated method stub
- return mGesture.onTouchEvent(event);
- }
詳細的測試例子如下:
- package com.jiubang.android.gesturetest;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.GestureDetector;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.GestureDetector.SimpleOnGestureListener;
- import android.view.View.OnTouchListener;
- import android.widget.Button;
- public class GestureActivity extends Activity
- implements OnTouchListener
- {
- private Button mButton = null;
- GestureDetector mGesture = null;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.i("TEST", "onCreate");
- mButton = (Button)findViewById(R.id.button1);
- mButton.setOnTouchListener(this);
- mGesture = new GestureDetector(this, new GestureListener());
- }
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
- // TODO Auto-generated method stub
- return mGesture.onTouchEvent(event);
- }
- class GestureListener extends SimpleOnGestureListener
- {
- @Override
- public boolean onDoubleTap(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onDoubleTap");
- return super.onDoubleTap(e);
- }
- @Override
- public boolean onDown(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onDown");
- return super.onDown(e);
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onFling:velocityX = " + velocityX + " velocityY" + velocityY);
- return super.onFling(e1, e2, velocityX, velocityY);
- }
- @Override
- public void onLongPress(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onLongPress");
- super.onLongPress(e);
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onScroll:distanceX = " + distanceX + " distanceY = " + distanceY);
- return super.onScroll(e1, e2, distanceX, distanceY);
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e)
- {
- // TODO Auto-generated method stub
- Log.i("TEST", "onSingleTapUp");
- return super.onSingleTapUp(e);
- }
- }
- }