@cxm-2016
2017-01-30T19:27:05.000000Z
字数 2215
阅读 2503
Android
版本:2
作者:陈小默
在某些情况下,我们可能会需要用户自定义手势来完成某些操作,比如我曾经用过的手机里就有这个功能:用户在手机锁屏上绘制某些字母,就能够打开相应的应用。接下来我们将说明自定义手势的一般用法。
很显然,如果我们需要保存一个手势,那么必定先要在View上绘制手势。Android提供了GestureOverlayView这个视图组件,该组件继承自FrameLayout。我们可以向使用普通View一样将其添加到布局文件中。
<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">
<android.gesture.GestureOverlayView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gestureColor="#666"
android:gestureStrokeType="single"
android:gestureStrokeWidth="3">
</android.gesture.GestureOverlayView>
</RelativeLayout>
该View中用到了三个比较重要的属性
Android中使用GestureLibrary代表手势库,其中提供了保存手势和识别手势的方法。GestureLibraries是Android提供的管理手势库的工具了,其中提供了下列几种方法来加载手势库:
public static GestureLibrary fromFile(String path) ;
public static GestureLibrary fromFile(File path) ;
public static GestureLibrary fromPrivateFile(Context context, String name) ;
public static GestureLibrary fromRawResource(Context context, @RawRes int resourceId) ;
这些方法看名字就知道其会从哪些地方加载手势库文件,其加载完成后会返回GestureLibrary对象代表这个手势库文件。
为了保存用户录入的手势,我们需要给刚才添加的GestureOverlayView设置监听:
(findViewById(gestureOverlayView) as GestureOverlayView).addOnGesturePerformedListener { gestureOverlayView, gesture ->
...
}
当我们获取到Gesture对象后,我们就可以使用刚刚创建的GestureLibrary来保存手势了,其中GestureLibrary提供了addGesture()将手势保存到当前手势库对象中,而save()方法会将当前对象中的手势数据存储到本地文件中,如果我们在添加手势后没有调用save()方法进行保存,则下次打开手势库将无法找到上次录入的手势:
gestureLib.addGesture("Gesture_Name", gesture)
gestureLib.save()
于是手势就被保存在了手势库中,并且被命名为"Gesture_Name"
我们已经在1.1.2中介绍了如何加载手势库,但是这里需要补充说明:当我们使用1.1.2中的方法创建手势库对象之后,还需要使用load()方法去将本地数据加载进来:
gestureLib.load()
GestureLibrary提供了recognize方法从当前手势库中识别与Gesture匹配的手势,其返回值是ArrayList<Prediction>
对象,Prediction中只存放了两个属性,一个代表手势名称的name,一个代表匹配分数的score,分数越高表明两个手势越相似。以下示例打印输出了与当前输入手势匹配值大于2的手势的名称:
gestureLib.recognize(gesture).forEach { prediction ->
if(prediction.score > 2.0)
Log.e("TAG","${prediction.name}")
}