使用GestureOverlayView进行手势识别
正如之前所说的,使用GestureDetector的识别方法,手势的种类非常有限,如果需要对复杂的手势进行识别,就需要GestureOverlayView的方法
GestureOverlayView的使用:
首先使用Gestures Builder程序(下面有附带文件)生成手势文件(即自定义一些需要用的手势,然后取名),如果是模拟机,然后在文件的mnt/sdcard/Download找到gestures文件,把它导出到电脑,然后在GestureOverlayView的项目文件下的layout中新建一个Folder,取名为raw,然后把gestures文件复制粘贴到raw文件下
GestureOverlayView是一种用于手势输入的透明覆盖层,可覆盖在其他控件的上方,也可包含其它控件
使用的时候,在activity_main的xml布局文件中,在Anvanced分类中就能找到GestureOverlayView控件,然后让其包裹住需要进行操作的控件
例子程序如下:
package com.example.gestureoverlayviewdemo;
import java.util.ArrayList;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import android.os.Build;
public class MainActivity extends Activity {
private GestureOverlayView gestureOverlayView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gestureOverlayView = (GestureOverlayView) findViewById(R.id.gestureOverlayView1);
/**
* 找到刚才预设定的手势文件
* 加载那个手势文件中的所有手势
* 匹配,识别
*/
//从资源中将手势库文件加载进来
final GestureLibrary library= GestureLibraries.fromRawResource(MainActivity.this, R.raw.gestures);
library.load();
/**
* GestureOverlayView.OnGestureListener 手势监听器
* GestureOverlayView.OnGesturePerformedListener 手势执行监听器
* GestureOverlayView.OnGesturingListener 手势执行中监听器
*/
gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
/**
* GestureOverlayView的一些常见的XML属性设置,设置在xml中
* 1.Android:eventsInterceptionEnabled 定义当手势已经被识别出来时,是否拦截该手势动作
* 2.Android:fadeDuration 当用户画完手势效果淡出的时间
* 3.Android:fadeEnabled 当用户画完之后手势是否自动淡出
* 4.Android:gestureColor 手势的颜色
* 5.Android:gestureStrokeType 笔画的类型(单笔画或者多笔画)
* 6.Android:gestureStrokeWidth;
*/
@Override
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
//读出手势库中的内容 识别手势
ArrayList
Prediction prediction= mygesture.get(0);//每次都会从零开始拿跟输入的手势进行比对
//Prediction有两个返回值,一个是name,一个是score相似度值,自已定义
if(prediction.score>=3.0){
if(prediction.name.equals("exit")){
finish();//程序退出
}
if(prediction.name.equals("next")){
Toast.makeText(MainActivity.this, "播放下一首歌", Toast.LENGTH_SHORT).show();
}
if(prediction.name.equals("previous")){
Toast.makeText(MainActivity.this, "播放上一首歌", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(MainActivity.this, "没有该手势", Toast.LENGTH_SHORT).show();
}
}
});
}
}
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.gestureoverlayviewdemo.MainActivity" tools:ignore="MergeRootFrame" > android:id="@+id/gestureOverlayView1" android:layout_width="400px" android:layout_height="400px" android:gestureColor="#FF0000" android:gestureStrokeWidth="2" android:gestureStrokeType="multiple" > android:id="@+id/p_w_picpathView1" android:layout_width="400px" android:layout_height="300px" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:src="@drawable/ic_launcher" />