当前位置: 代码迷 >> Android >> android - Gesture学习 一
  详细解决方案

android - Gesture学习 一

热度:83   发布时间:2016-05-01 20:20:15.0
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

  相关解决方案