`
su1216
  • 浏览: 663763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71204
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:127876
社区版块
存档分类
最新评论

android - Gesture学习 1

阅读更多

手势已经不是什么新鲜事物了
关于手势在android上面的应用,我想大概有这么两种
1.用户画完一个手势,然后系统识别
2.用户的动作没有完成,边画边识别

比如:我想定义一个操作,画一个M,然后系统打开music应用,这就是情况1
在list页面中,用户不断拨动list,页面跟随滚动,这是情况2

这里先总结一下情况1

 

==增加+获取=====================================================

 

用户需要在页面上加入组件GestureOverlayView

<android.gesture.GestureOverlayView
	android:id="@+id/gestures_overlay"
	android:layout_width="match_parent"
	android:layout_height="0dip"
	android:layout_weight="1.0"
	android:gestureStrokeType="multiple" />

 这个组件是用来接收手势用的,有了它,你就可以在屏幕上面乱画了

 

 

我们需要给他设置监听事件

GestureOverlayView gestureOverlayView = (GestureOverlayView) findViewById(R.id.gestures_overlay);
gestureOverlayView.addOnGestureListener(new GestureOverlayView.OnGestureListener() {
			public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) {}
			public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {}
			public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) {}
			public void onGesture(GestureOverlayView overlay, MotionEvent event) {}
});

 上面匿名类的四个函数作用显而易见

 

用户输入的手势对象如何得到呢

mGesture = gestureOverlayView.getGesture();

如果你觉得用户手势太短了,影响判断,那么可以在onGestureEnded时候做一些处理

比如:

if (mGesture.getLength() < LENGTH_THRESHOLD) {
    gestureOverlayView.clear(false);//清除掉用户手势
    mGesture = null;
    //有些东西太短了是不行的...
}else{
    //这样就可以了
}

xml里面写了一个属性android:gestureStrokeType="multiple"

这里可以设置single和multiple

如果你只需要识别一笔,那么single就可以了,如果不确定,那么设置成multiple

"二",就需要两笔才能画出

gesture.getStrokesCount()能得到手势的笔数

(ps:ArrayList<GestureStroke> gestureStrokeList = gesture.getStrokes();

也能得到每一笔的信息)

 

用户画好了手势,如何保存呢

很不幸,手势不是保存到数据库中的,也不能直接保存到数据库中,它是以文件的形式存在的

 

GestureLibrary gestureLibrary;

 

 Library,是的,文件是一个手势库,也就是说,一个文件对应多个手势

 

获得这个Library

gestureLibrary = GestureLibraries.fromFile(path);

然后保存到这个Library

gestureLibrary.addGesture(mName, mGesture);
gestureLibrary.save();

 

增删改查的增加已经结束了

==查询=======================================================

下面看看如何查询

 

mGestureLibrary.getGestures(entryName)

 

 很不幸,它返回一个ArrayList<Gesture>,这也就意味着一个name对应多个Gesture

 

如果要获得库中所有手势,貌似只能这样

final Set<String> entries = mGestureLibrary.getGestureEntries();

 先获得所有名字,然后再获得每个名字对应的所有手势

 

 

但是大多数时候我们并不关心这些

我们更关心的是,如果用户做了个手势,我想知道在库中有没有和这个手势相似的,有多相似!

ArrayList<Prediction> predictions = gestureLibrary.recognize(gesture);

 返回的是精确度的list

Prediction里面只有两个属性,name和score

score越大,那么就与recognize的手势越接近

 

 

 

==修改+删除=====================================================

如果要对手势修改(貌似也没什么可改的),比如改个名字吧,那么只能先删除,再添加了

gestureLibrary.removeGesture(oldOne, oldGesture);
gestureLibrary.addGesture(newOne, newGesture);
gestureLibrary.save();

 最后别忘记save

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics