Android 手勢識別


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事件總是第一個發生的。

滾動與滑動的最大區別在於,前者是在手指的“驅使”下運動的,手指離開界面後,滾動即停止;而後者開始也是在手指的“驅使”下運動的,手指離開界面後,屏幕會在慣性驅使下再滑動一段距離。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *