Gesture是android中提供一种对手势轨迹管理的一种机制,大家都如何使用它已经比较熟悉了,今天八一八内部的一些秘密,来看看gesture到底是个什么东西,又是如何识别的。
在没有看源码之前,大家想当然的也会有这么一个认识,那就是Gesture应该就是一个轨迹,没错,这就是它的本质,并且在屏幕上画出来的时候像不像在写字呀,所以android中把这个称为GestureStroke,笔画就是一个线的轨迹,就是一些点的集合。简单来说添加一个手势就是将这个手势的轨迹保存到文件中,删除就是将文件中这个轨迹删除,至于识别就比较麻烦一点,类似于图形匹配的概念。Android中的识别算法主要用了两种:一种是先对两个手势进行时间采样,再计算其余弦距离;还有一种是先进行空间采样在计算其平方欧式距离。老实说个人对这种算法也是不甚了解只能照大概意思描述了,请知道的大牛不吝指教。
上面是整个Gesture系统的类图,从Gesture和GestureStroke两个类中我们验证了朴实的思想往往是真理,的确所谓Gesture其实就是连续轨迹点的集合,它实现了Parcelable接口看来是可以序列化进行传递的。
手势识别的过程也比较简单,主要来说就是两大步,首先将原有的手势加载到内存中,然后将需要识别的手势量化再与内存中的手势库中的数据进行比对找到最匹配的。细分一下按如下流程进行。
1、创建GestureLibrary,调用GestureLibrarys.fromFile创建一个基于文件的Library。
2、将原有GestureLibrary中的Gesture加载到内存中,调用的是GestureLibrary.load方法,这里面又有一些其他类的调用,最终是将这个文件中所有的Gesture量化(就是前面说的时间或者空间采样)组成Instance,并保存在InstanceLearner中,是一个List。
3、识别,通过调用GestureLibrary.recognize方法来实现,内部涉及到的逻辑也就是先将这个Gesture进行采样生成一个Instance,然后与上一步保存在InstanceLearner中的Instances挨个进行匹配,所谓匹配就是前面提到的计算余弦距离或者是平方欧式距离,这个值也就是两个手势的匹配度指标。
识别过程是比较简单,但是单纯这样操作其实效果是一般般的,所有目前很多应用都有使用汉王的手写识别,这里就不说咯。