标签:
目标效果:
程序运行,画左箭头提示上一个,画右箭头提示下一个,并且还可以画符号退出程序。
这里自定义手势使用的是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>
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(); } } }); } }
Android-GestureOverlayView自定义手势命令
标签:
原文地址:http://blog.csdn.net/hester_hester/article/details/51354878