[关闭]
@cxm-2016 2017-01-30T19:27:05.000000Z 字数 2215 阅读 2503

Android:自定义手势

Android

版本:2
作者:陈小默


一、手势使用介绍

在某些情况下,我们可能会需要用户自定义手势来完成某些操作,比如我曾经用过的手机里就有这个功能:用户在手机锁屏上绘制某些字母,就能够打开相应的应用。接下来我们将说明自定义手势的一般用法。

1.1 增加手势

1.1.1 GestureOverlayView

很显然,如果我们需要保存一个手势,那么必定先要在View上绘制手势。Android提供了GestureOverlayView这个视图组件,该组件继承自FrameLayout。我们可以向使用普通View一样将其添加到布局文件中。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <android.gesture.GestureOverlayView
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:gestureColor="#666"
  9. android:gestureStrokeType="single"
  10. android:gestureStrokeWidth="3">
  11. </android.gesture.GestureOverlayView>
  12. </RelativeLayout>

该View中用到了三个比较重要的属性

1.1.2 手势库

Android中使用GestureLibrary代表手势库,其中提供了保存手势和识别手势的方法。GestureLibraries是Android提供的管理手势库的工具了,其中提供了下列几种方法来加载手势库:

  1. public static GestureLibrary fromFile(String path) ;
  2. public static GestureLibrary fromFile(File path) ;
  3. public static GestureLibrary fromPrivateFile(Context context, String name) ;
  4. public static GestureLibrary fromRawResource(Context context, @RawRes int resourceId) ;

这些方法看名字就知道其会从哪些地方加载手势库文件,其加载完成后会返回GestureLibrary对象代表这个手势库文件。

1.1.3 获取用户录入的手势

为了保存用户录入的手势,我们需要给刚才添加的GestureOverlayView设置监听:

  1. (findViewById(gestureOverlayView) as GestureOverlayView).addOnGesturePerformedListener { gestureOverlayView, gesture ->
  2. ...
  3. }

1.1.4 保存手势

当我们获取到Gesture对象后,我们就可以使用刚刚创建的GestureLibrary来保存手势了,其中GestureLibrary提供了addGesture()将手势保存到当前手势库对象中,而save()方法会将当前对象中的手势数据存储到本地文件中,如果我们在添加手势后没有调用save()方法进行保存,则下次打开手势库将无法找到上次录入的手势:

  1. gestureLib.addGesture("Gesture_Name", gesture)
  2. gestureLib.save()

于是手势就被保存在了手势库中,并且被命名为"Gesture_Name"

1.2 识别手势

1.2.1 加载手势库

我们已经在1.1.2中介绍了如何加载手势库,但是这里需要补充说明:当我们使用1.1.2中的方法创建手势库对象之后,还需要使用load()方法去将本地数据加载进来:

  1. gestureLib.load()

1.2.2 识别手势

GestureLibrary提供了recognize方法从当前手势库中识别与Gesture匹配的手势,其返回值是ArrayList<Prediction>对象,Prediction中只存放了两个属性,一个代表手势名称的name,一个代表匹配分数的score,分数越高表明两个手势越相似。以下示例打印输出了与当前输入手势匹配值大于2的手势的名称:

  1. gestureLib.recognize(gesture).forEach { prediction ->
  2. if(prediction.score > 2.0)
  3. Log.e("TAG","${prediction.name}")
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注