Android之手势识别



忍别人所不能忍的痛,吃别人所别人所不能吃的苦,是为了收获得不到的收获。


本讲内容:手势识别(Gesture:手势Detector:识别)


一、手势识别的两种方法

1、使用GestureDetector

2、使用GestureOverlayView


二、使用GestureDetector进行手势识别

1)GestureDetector类认识

GestureDetector类对外提供了两个接口:OnGestureListener(处理单击类消息),OnDoubleTapListener(处理双击类消息),还有一个内部类SimpleOnGestureListener;SimpleOnGestureListener类是GestureDetector提供给我们的一个更方便的响应不同手势的类,它实现了上述两个接口,该类是static class,也就是说它实际上是一个外部类,我们可以在外部继承这个类,重写里面的手势处理方法。因此实现手势识别有两种方法,一种实现OnGestureListener接口,另一种是使用SimpleOnGestureListener类。


2)手势交互过程(原理)
1、触屏一刹那,触发MotionEvent事件
2、被OnTouchListener监听,在onTouch()中获得MotionEvent对象
3、GestureDetector通过onTouchEvent()方法转发MotionEvent对象到OnGestureListener接口
4、OnGestureListener获得MotionEvent对象,根据该对象封装的信息做出合适的反馈


3)MotionEvent对象:
1、用于封装手势,触摸笔、轨迹球等动作事件
2、内部封装用于记录横轴和纵轴坐标的属性X和Y


4)OnGestureListener接口提供的方法:

按下(onDown)
刚刚手指接触到触摸屏的那一刹那,就是触的那一下。
抛掷(onFling)
手指在触摸屏上迅速移动,并松开的动作。
长按(onLongPress)
手指按在持续一段时间,并且没有松开。
滚动(onScroll)
手指在触摸屏上滑动。
按住(onShowPress)
手指按在触摸屏上,它的时间范围在按下起后,在长按之前。
抬起(onSingleTapUp)
手指离开触摸屏的那一刹那。


5)OnDoubleTapListener接口提供的方法

onDoubleTap()
双击的第二下Touch down时触发
onDoubleTapEvent()
双击的第二下Touch down和up都会触发,可用e.getAction()区分。
onSingleTapConfirmed()
手指离开触摸屏的那一刹那。



6)SimpleOnGestureListener类

OnGestureListener类全部重载6个方法,这样会造成有些手势动作我们用不到。SimpleOnGestureListener类的出现为我们解决了这个问题。

1、按下(onDown) 2、抛掷(onFling)


示例一:

下面是res/layout/activity_main.xml 布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/id_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/pic" />

</RelativeLayout>


下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	private ImageView img;
	private GestureDetector mGestureDetector;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		img=(ImageView) findViewById(R.id.id_image);
		mGestureDetector=new GestureDetector(this,new myGestureListener());
		img.setOnTouchListener(new OnTouchListener() {
			//可以捕获到触摸屏幕发生的event事件
			public boolean onTouch(View v, MotionEvent event) {
				mGestureDetector.onTouchEvent(event);
				return true;
			}
		});
	}
	
	class myGestureListener extends SimpleOnGestureListener{
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {
			if(e1.getX()-e2.getX()>50){
				Toast.makeText(MainActivity.this,"从右往左滑动",Toast.LENGTH_LONG).show();
			}else if(e2.getX()-e1.getX()>50){
				Toast.makeText(MainActivity.this,"从左往右滑动",Toast.LENGTH_LONG).show();
			}
			
			return super.onFling(e1, e2, velocityX, velocityY);
		}
	}

}

三使用GestureOverlayView进行手势识别
1、使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows/samples/android-8/GestureBuilder)
2、加入生成的手势文件(res/raw/gestures)


GestureOverlayView是一种用于手势输入的透明覆盖层,可覆盖在其他控件的上方,也包含其他控件。存在3个监听器接口
GestureOverlayView.OnGestureListener 手势监听器
GestureOverlayView.OnGesturePerformedListener 手势执行监听器(常用)
GestureOverlayView.OnGesturingListener 手势执行中监听器


一些常用的XMl属性
Android:eventsInterceptionEnabled 定义当手势已经被出识别出来时,是否拦截该手势动作
Android:fadeDuration 当用户画完手势效果淡出的时间
Android:fadeEnabled 用户画完之后手势是否自动淡出
Android:gestureColor 手势的颜色
Android:gestureStrokeType 笔画的类型
Android:gestureStrokeWidth 笔画的粗线


示例二:

   

导入SDK自带例子GestureBuilder建立手势库(new-Other-Android-Android Sample Project)生成的gestures文件放在res/raw/gestures中

下面是res/layout/activity_main.xml 布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.gesture.GestureOverlayView
        android:id="@+id/gestureOverlayView1"
        android:layout_width="300dp"
        android:layout_height="300dp">
        
        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/c1"/>
    </android.gesture.GestureOverlayView>

</LinearLayout>

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	private GestureOverlayView mGestureOverlayView;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mGestureOverlayView=(GestureOverlayView) findViewById(R.id.gestureOverlayView1);
		
		/**
		 * 1、找到设置的手势文件库
		 * 2、加载手势文件库中的所有手势
		 * 3、匹配识别
		 */
		final GestureLibrary library=GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures);
		library.load();
		mGestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
			
			public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
				//读出手势库中内容,识别手势
				ArrayList<Prediction> mygesture=library.recognize(gesture);
				Prediction predction=mygesture.get(0);
				if(predction.score>5.0){//相似度,越大越相似
					if(predction.name.equals("yes")){
						Toast.makeText(MainActivity.this, "正确的", Toast.LENGTH_LONG).show();
					}else if(predction.name.equals("no")){
						Toast.makeText(MainActivity.this, "错误的", Toast.LENGTH_LONG).show();
					}
				}else{
					Toast.makeText(MainActivity.this, "没有该手势", Toast.LENGTH_LONG).show();
				}
			}
		});
	}
}



Take your time and enjoy it 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值