Gesture 中文名字叫:手势。就是类似一些浏览器(chrome、Firefox、傲游等)里用鼠标快速的画出一些图像(手势),然后根据这些图像执行某些功能(例如:前进、后退、刷新等)。Android 里自带了手势的功能,只要 import android.gesture 下的一些包就可以使用了。先介绍下相关的类:
手势相关的类
- GestureOverlayView
- GestureLibrary
- GestureLibrarys
- Gesture
使用流程
一般的使用流程如下:- 添加 GestureOverlayView? 到你需要使用手势的 Activity 中。然后可以设置一些 view 的属性(例如手势的颜色、笔画、监听函数等)。
- 通过已经保存的文件得到 GestureLibrarys? (文件不存在的话,则会创建一个新的文件),然后通过 GestureLibrarys? 得到 GestureLibrary? 。
- 通过 GestureLibrary? 加载文件中的 Gesture 数据。
- 在 GestureOverlayView? 中画 Gesture,然后可以把这个 Gesture 添加到 GestureLibrary? 中(添加完成后,可以保存到文件)。
- 最后可以把从 GestureOverlayView? 中得到的 Gesture 和 GestureLibrary? 这已有的 Gesture 进行比较(识别),然后根据 Gesture 的定义执行不同的操作。
使用方法
GestureOverlayView?
- 首先要在 Activity 里添加 GestureOverlayView? ,在 Activity 的 xml 中添加如下代码:(别用 eclipse 自带的拖界面的方式,很不好用,手动写比较好)
// 注意如下 xml 的放置方式,把 activity 别的 view 放到 GestureOverlayView 的里面。 // 这样的话就 GestureOverlayView 就覆盖了整个界面了,这样就可以在整个界面画手势。 // 否则的话 GestureOverlayView 不会覆盖整个界面的。 <android.gesture.GestureOverlayView android:id="@+id/match_gov" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gestureColor="#FF00FF00" > <ListView android:id="@+id/gesture_lv" android:layout_width="wrap_content" android:layout_height="fill_parent" /> </android.gesture.GestureOverlayView>
- 然后可以设置 GestureOverlayView? 的一些属性,例如:
- void setGestureStrokeType(int gestureStrokeType) : 这个是设置 Gesture 笔画的。可以设置为:
// 多笔画 GESTURE_STROKE_TYPE_MULTIPLE // 单笔画 GESTURE_STROKE_TYPE_SINGLE
-
- void setGestureColor(int color) : 设置 Gesture 的颜色。
// 暂时不太清楚这个接口是什么时候调用的 public abstract void onGesture (GestureOverlayView overlay, MotionEvent event) // 当 gesture 别取消的时候调用,我目前还不太清楚什么情况下 gesture 会被取消 public abstract void onGestureCancelled (GestureOverlayView overlay, MotionEvent event) // 当完成一个 gesture 的时候调用,最有用的一个接口。这个接口需要注意一点: // 当你设置 GestureOverlayView 是多笔画的时候,没画完一笔这个接口都会被调用一次, // 要想分辨多笔画 gesture 是否完成,可以通过 Gesture 的接口 getStrokesCount() 查询当前 gesture 的笔画来确定 public abstract void onGestureEnded (GestureOverlayView overlay, MotionEvent event) // 当一个 gesture 开始画的时候调用,比较有用的一个接口 public abstract void onGestureStarted (GestureOverlayView overlay, MotionEvent event)
-
- 还有一些别的属性可以设置,可以自己去查看 android 的 sdk docs。
GestureLibrarys?
这个全都是 static 的方法,主要是用来读取 Gesture 文件的。它的主要方法是:// 通过一个 java file io 来得到 GestureLibrary static GestureLibrary fromFile(File path) // 通过一个文件路径来打开文件得到 GestureLibrary static GestureLibrary fromFile(String path)
GestureLibrary?
从 GestureLibrarys? 得到 GestureLibrary? 后,就可以操作 Gesture 了:
- abstract boolean load() :
- void addGesture(String entryName, Gesture gesture) :
- void removeEntry(name) :
- abstract boolean save() :
- Set getGestureEntries() :
- ArrayList getGestures(String entryName) :
- ArrayList recognize(Gesture gesture) :
// 匹配的 Gesture 的名字 String name; // 匹配的分数。越高就表示匹配程度越高。一般来说低于 1.00 的就是连大致形状都不像的。 // 一般来说你需要设定一个判定的分数线。至于是多少就需要自己调试一下了。 doulbe score
Gesture
Gesture 是一个路径,通过一系列点来表示。如果你画类似的 Gesture,但是路径的顺序相反的话,那就是不同的 Gesture 来的。Gesure 的操作一般都集中在 GestureLibrary? 里了。 Gesure 本身目前来说我用到的就一个接口:
- Bitmap toBitmap(int width, int height, int inset, int color) :
小结
使用 Gesutre 的时候注意要申请写 sdcard 的权限,不然 Gesture 不能正常保存的。附件里有一个例子,可以自定义3个 Gesture 来启动 android 自带的3个应用(点击相应的 Gesture 进行编辑),附上运行效果:
