忍别人所不能忍的痛,吃别人所别人所不能吃的苦,是为了收获得不到的收获。
本讲内容:手势识别(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