1. 程式人生 > >Android觸碰事件

Android觸碰事件

OnTouchListener使用

public class ViewActivity extends Activity implements View.OnTouchListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_gestrue);

        LinearLayout ll_context = (LinearLayout) findViewById(R.id.ll_context);
        ll_context.setOnTouchListener(this
); } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: Log.v("-->", "手指碰到螢幕"); break; case MotionEvent.ACTION_MOVE: Log.v("-->"
, "手指在移動"); break; case MotionEvent.ACTION_OUTSIDE: Log.v("-->", "手指離開view的邊界"); break; case MotionEvent.ACTION_UP: Log.v("-->", "手指離開螢幕"); break; case MotionEvent.ACTION_SCROLL: Log.v("-->"
, "手指在滑動"); break; case MotionEvent.ACTION_POINTER_DOWN: Log.v("-->", "非主手指碰到螢幕"); break; case MotionEvent.ACTION_POINTER_UP: Log.v("-->", "非主手指離開螢幕"); break; } return true;//攔截事件 } }

Tip:MotionEvent常用方法

event.getY();//觸碰點獲取距離v頂部的距離
event.getRawY();//觸碰點獲取距離螢幕頂部的距離
event.getPointerCount();//獲取觸碰手指的個數

GestureDetector使用:

//GestureDetector這個類對外提供了兩個介面:OnGestureListener,OnDoubleTapListener,還有一個內部類SimpleOnGestureListener。

GestureDetector.OnGestureListener介面:用來通知普通的手勢事件,該介面有如下六個回撥函式:

1.onDown(MotionEvent e):down事件;

2.onSingleTapUp(MotionEvent e):一次點選up事件;在touch down後又沒有滑動
(onScroll),又沒有長按(onLongPress),然後Touchup時觸發。
點選一下非常快的(不滑動)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
點選一下稍微慢點的(不滑動)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

3.onShowPress(MotionEvent e):down事件發生而move或則up還沒發生前觸發該事件;Touch了還沒有滑動時觸發(與onDown,onLongPress)比較onDown只要Touch down一定立刻觸發。而Touchdown後過一會沒有滑動先觸發onShowPress再是onLongPress。所以Touchdown後一直不滑動
按照onDown->onShowPress->onLongPress這個順序觸發。

4.onLongPress(MotionEvent e):長按事件;Touch了不移動一直Touch down時觸發

5.onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動手勢事件;Touch了滑動一點距離後,在ACTION_UP時才會觸發引數:e1 第1個ACTION_DOWN MotionEvent 並且只有一個;e2 最後一個ACTION_MOVE MotionEvent ;velocityX X軸上的移動速度,畫素/秒 ;velocityY Y軸上的移動速度,畫素/秒.觸發條件:X軸的座標位移大於FLING_MIN_DISTANCE,且移動速度大於FLING_MIN_VELOCITY個畫素/秒

6.onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在螢幕上拖動事件。無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發
拋:手指觸動屏幕後,稍微滑動後立即鬆開

GestureDetector.OnDoubleTapListener介面:用來通知DoubleTap事件,類似於滑鼠的雙擊事件。

1.onDoubleTap(MotionEvent e):在雙擊的第二下,Touch down時觸發 。
2.onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢中的事件,包含down、up和move事件(這裡指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函式通知);雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。
3.onSingleTapConfirmed(MotionEvent e):用來判定該次點選是SingleTap而不是DoubleTap,如果連續點選兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點選則判定該次點選為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。這個方法不同於onSingleTapUp,他是在GestureDetector確信使用者在第一次觸控式螢幕幕後,沒有緊跟著第二次觸控式螢幕幕,也就是不是“雙擊”的時候觸發

tip:

//distanceX,是前後兩次call的X距離,不是e2與e1的水平距離; 是前後兩次call的Y距離,不是e2與e1的垂直距離

使用方法:

1:繼承GestureDetector.OnGestureListener
2:例項化檢測器GestureDetector mDetector = new GestureDetector(ViewActivity.this, this);
3:在ontouch裡面回撥方法

@Override
public boolean onTouch(View v, MotionEvent event) {
  mDetector.onTouchEvent(event);
  return true;
}