為了加強鼠標響應(yīng)事件,Android提供了GestureDetector手勢識別類。通過GestureDetector.OnGestureListener來獲取當前被觸發(fā)的操作手勢(Single Tap Up、Show Press、Long Press、Scroll、Down、Fling),具體包括以下幾種:
boolean onDoubleTap(MotionEvent e) 解釋:雙擊的第二下Touch down時觸發(fā) boolean onDoubleTapEvent(MotionEvent e) 解釋:雙擊的第二下Touch down和up都會觸發(fā),可用e.getAction()區(qū)分。 boolean onDown(MotionEvent e) 解釋:Touch down時觸發(fā) boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 解釋:Touch了滑動一點距離后,up時觸發(fā)。 void onLongPress(MotionEvent e) 解釋:Touch了不移動一直Touch down時觸發(fā) boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 解釋:Touch了滑動時觸發(fā)。 void onShowPress(MotionEvent e) 解釋:Touch了還沒有滑動時觸發(fā) (與onDown,onLongPress比較 onDown只要Touch down一定立刻觸發(fā)。 而Touchdown后過一會沒有滑動先觸發(fā)onShowPress再是onLongPress。 所以Touchdown后一直不滑動,onDown->onShowPress->onLongPress這個順序觸發(fā)。
boolean onSingleTapConfirmed(MotionEvent e) boolean onSingleTapUp(MotionEvent e) 解釋:上面這兩個函數(shù)都是在touch down后又沒有滑動(onScroll),又沒有長按(onLongPress),然后Touchup時觸發(fā)。
點擊一下非??斓模ú换瑒樱㏕ouchup: onDown->onSingleTapUp->onSingleTapConfirmed 點擊一下稍微慢點的(不滑動)Touchup: onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
使用GestureDetector需要在View中重寫onTouchEvent事件,例如:
- GestureDetector mGesture = null;
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
-
- 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;
-
-
- @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)
- {
-
- return mGesture.onTouchEvent(event);
- }
-
- class GestureListener extends SimpleOnGestureListener
- {
-
- @Override
- public boolean onDoubleTap(MotionEvent e)
- {
-
- Log.i("TEST", "onDoubleTap");
- return super.onDoubleTap(e);
- }
-
- @Override
- public boolean onDown(MotionEvent e)
- {
-
- Log.i("TEST", "onDown");
- return super.onDown(e);
- }
-
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY)
- {
-
- Log.i("TEST", "onFling:velocityX = " + velocityX + " velocityY" + velocityY);
- return super.onFling(e1, e2, velocityX, velocityY);
- }
-
- @Override
- public void onLongPress(MotionEvent e)
- {
-
- Log.i("TEST", "onLongPress");
- super.onLongPress(e);
- }
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2,
- float distanceX, float distanceY)
- {
-
- Log.i("TEST", "onScroll:distanceX = " + distanceX + " distanceY = " + distanceY);
- return super.onScroll(e1, e2, distanceX, distanceY);
- }
-
- @Override
- public boolean onSingleTapUp(MotionEvent e)
- {
-
- Log.i("TEST", "onSingleTapUp");
- return super.onSingleTapUp(e);
- }
-
- }
- }
|