Android:自定义手势

标签(空格分隔): android

编号:000136
作者:陈小默
语言:kotlin
版本:1


  • Android自定义手势
  • 一手势使用介绍
  • 1 增加手势
  • 11 GestureOverlayView
  • 12 手势库
  • 13 获取用户录入的手势
  • 14 保存手势
  • 2 识别手势
  • 21 加载手势库
  • 22 识别手势



一、手势使用介绍

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

1.1 增加手势

1.1.1 GestureOverlayView

很显然,如果我们需要保存一个手势,那么必定先要在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中用到了三个比较重要的属性

  • gestureColor:画笔的颜色
  • gestureStrokeType:该手势是一笔完成(single)还是多笔完成(multiple),通常情况下一笔即可
  • gestureStrokeWidth:画笔的粗细

1.1.2 手势库

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对象代表这个手势库文件。

1.1.3 获取用户录入的手势

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

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

1.1.4 保存手势

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

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

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

1.2 识别手势

1.2.1 加载手势库

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

gestureLib.load()

1.2.2 识别手势

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

gestureLib.recognize(gesture).forEach { prediction ->
            if(prediction.score > 2.0)
                Log.e("TAG","${prediction.name}")
        }