目标效果:
程序运行,画左箭头提示上一个,画右箭头提示下一个,并且还可以画符号退出程序。
这里自定义手势使用的是GestureOverlayView进行设置的,SDK2.0以上系统都自带了一个GestureBuilder手势库,SDK4.2以前路径是android-sdk-windows\samples\android-10\GestureBuilder,4.2以后路径是sdk-extras-android-support-samples-GestureBuilder,有时可能自己安装的并没有这个库,那就需要下载一个放到路径的目录中,下载地址http://pan.baidu.com/s/1bpbno6r。
1.首先需要导入手势库,添加手势文件,模拟器上有现成的软件这一步可以省略,但是真机测试时需要导入在手机上运行,因为我之前导入一次了,所以下边截图时提示红色错号和Finish不能点击,第一次导入都是正常的。(没有图示的直接点击next)
2.运行后,模拟器或手机上会多了一个小程序。
3.打开后添加项目需要的手势,保存后如图三,提示保存路径,模拟器保存路径为storage-sdcard-gestures,真机保存路径为storage-emulated-0-gestures。(可能不同手机路径不同)
4.现在只需要找到gestures文件,打开File Explorer,图一为模拟器的文件路径storage-sdcard-gestures,图二为真机的文件路径mnt-shell-emulated-0-gestures。(暂时不太明白为什么为什么真机的路径和保存时提示的不太一样)
5.导入gestures文件到桌面,新建项目,在res文件夹下新建raw文件夹,将gestures文件复制到raw文件夹中。
6.activity_main.xml页面放置一个ImageView控件和GestureOverlayView控件,并且使用GestureOverlayView控件将ImageView控件包含起来。(不包含也可以,GestureOverlayView控件默认在所有控件上方)
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"
tools:context=".MainActivity" >
<!--
Android:eventsInterceptionEnabled 定义当手势已经被识别出来时,是否拦截该手势
Android:fadeDuration 当用户画完,手势效果淡出的时间
Android:fadeEnabled 用户画完之后,手势是否自动淡出
Android:gestureColor 手势的颜色
Android:gestureStrokeType 笔画的类型
Android:geatureStrokeWidth 笔画的粗细
-->
<android.gesture.GestureOverlayView
android:gestureColor="#ff0000"
android:gestureStrokeWidth="10"
android:id="@+id/gestureOverlayView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/ivShow"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
</android.gesture.GestureOverlayView>
</RelativeLayout>
7.MainActivity.java页面匹配识别手势。
MainActivity.java页面:
package com.example.gestureoverlayview;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
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.view.Menu;
import android.widget.Toast;
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.gestureOverlayView);
/*找到预设定的手势文件并加载进来*/
final GestureLibrary library=GestureLibraries.fromRawResource(MainActivity.this,R.raw.gestures);//获取手势文件
library.load();
/*匹配识别*/
gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener() {
@Override
public void onGesturePerformed(GestureOverlayView arg0, Gesture gesture) {
//读出手势库中内容 识别手势
ArrayList<Prediction> mygesture=library.recognize(gesture);
Prediction predction=mygesture.get(0);
if(predction.score>=4.0){//相似度大于某个值(数字越大代表要求越相似),说明有该手势
if(predction.name.equals("exit")){
finish();
}else if(predction.name.equals("next")){
Toast.makeText(MainActivity.this,"下一个",Toast.LENGTH_SHORT).show();
}else if(predction.name.equals("previous")){
Toast.makeText(MainActivity.this,"上一个",Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(MainActivity.this,"没有该手势",Toast.LENGTH_SHORT).show();
}
}
});
}
}
8.运行就可以显示目标效果了。