1, android手势开发识别gestrue开发。
经过了一段android的学习,基本上了解了android的基础知识。今天,我们来研究一下android中特有的手势识别技术,即gesture。首先,我从网上找了很多资料,具体归纳起来有2类:
一类是触摸屏手势识别,另一类是输入法手势识别。
我们先来讨论一下第一类触摸屏手势识别,这个比较简单,就是利用触摸屏的fling、scroll等gesture(手势)来操作屏幕,比如用scroll手势在浏览器中滚屏,用fling在阅读器中翻页等。在android系统中,手势的识别是通过 接口来实现的。下面通过我自己的一个动手实验来进行介绍。
首先,我们在eclipse中创建一个工程,名称叫signfilpdemo。然后,在src中创建一个signfilpdemo源文件。这个工程是基于android1.
6的。因为,在android 1.6之前的版本中,需要开发者编写大量的**才能实现某些更为复杂的gestures功能。
而在之后的版本sdk中嵌入标准的gestures api库(package: 包括了所有与gesture技术相关的操作:存储、加载、创建新gestures和识别等。
其工程结构如下:
图1接着,我们知道android的事件处理机制是基于listener(***)来实现的,比如我们今天所说的触摸屏相关的事件,就是通过ontouchlistener。因此,我们在源**中要实现这个接口。另外,我们还要实现ongesturelistener接口,因为,那个手势的识别是通过 接口来实现的。
其中,ontouchevent方法则是实现了ontouchlistener中的抽象方法,我们只要在这里添加逻辑**即可在用户触摸屏幕时做出响应。在这里我们调用gesturedetector的ontouchevent()方法,将捕捉到的motionevent交给 gesturedetector 来分析是否有合适的callback函数来处理用户的手势。接下来,就是实现了以下6个抽象方法,其中最有用的当然是onfling()、onscroll()和onlongpress()了。
下面介绍一下:
1) 用户轻触触摸屏,由1个motionevent action_down触发,其源**如下:
public boolean ondown(motionevent e)
public void onshowpress(motionevent e)
2) 用户(轻触触摸屏后)松开,由一个1个motionevent action_up触发,其源**如下:
public boolean onsingletapup(motionevent e)
public boolean onfling(motionevent e1, motionevent e2, float velocityx,float velocityy)
我们今天来做一个onfling()事件的处理吧,这里需要注意的是fling事件的处理**中,除了第一个触发fling的action_down和最后一个action_move中包含的坐标等信息外,我们还可以根据用户在x轴或者y轴上的移动速度作为条件。在这个例子中,我们是根据用户在屏幕上移动的x轴坐标或者是y轴坐标位移来判断方向。如果x轴坐标位移大于50向左,小于-50向右,如果y轴坐标位移大于50向上,小于-50向下。
源**如下:
public boolean onfling(motionevent e1, motionevent e2, float velocityx,float velocityy)
return false;
如果鼠标向上移动,运行效果如下图2所示:
图2如果鼠标向下移动,运行效果如下图3所示:
图3如果鼠标向左移动,运行效果如下图4所示:
图4如果鼠标向右移动,运行效果如下图5所示:
图5通过上面的运行结果可以看出,只要鼠标向上下左右四个方向移动,就是相应地识别出,并且显示出相应的方向。这里需要注意的是因为是模拟器,所以只有通过鼠标来模拟,在真机环境中,就是触摸屏的识别了。
接下来,我们来讨论一下第二种输入法手势识别。这种方法就是需要定义一个描述手势动作的文件。在手写输入中,会为每一个字符定义一个特征码,这些特征码都保存在相应的文件中(可能有一个或多个这样的文件),当用户绘制一个描述字符的图形时,系统会为所绘制的图形提取特征码,然后会在保存特征码文件中查找相对应的特征码,如果找到,就会将对应的字符返回。
其中,这些文件被称为手势文件。这里我们讨论的是在android 2.1中提供了一个gesturebuilder工程(实际上从android 1.
6就带这个例子了),这个工程是一个手势api的演示,主要功能是建立手势信息,并将手势信息保存在手势文件中。下面,我们来演示一下。
首先在eclipse中打开这个工程,然后可以直接导入运行。运行后界面如图6所示。
图6由于上面还没建立手势,所以手势列表为空。下面开始建立我们的第一个手势。单击“add gesture”按钮,会进入建立手势的界面。
如图7所示。建立手势需要两个信息:手势名和手势图形。
在文本框中输入任意的字符串,如“矩形”,并且在文本框下面画一个如图7所示的矩形(差不多就行,不一定要很标准)。然后单击“done”按钮,第一个手势已经建立成功了。按着这种方法,再建立几个手势。
每成功建立完一个手势后,会在主界面的列表中看到我们所建立的手势,如图8所示。进入ddms透视图,会在sd卡的根目录看到一个gestures文件,如图9所示。然后将该文件导出到pc上,以备以后使用。
图7图8
图9通过前面的介绍,我们知道绘制手势图像好像是在一个类似画布的区域,实际上,这是一个组件。我们可以在这个组件上绘制手势,并会触发一个识别手势的事件。了解了原理,接下来,我们利用手势自动输入字符串。
首先需要在布局文件中添加一个edittext和gestureoverlayview组件,**如下:
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_height="wrap_content" android:layout_width="fill_parent"/>
android:gesturestroketype="multiple" android:id="@id/gestures"
android:layout_height="fill_parent" android:layout_width="fill_parent"/>
接着,使用手势文件的第一步是装载手势文件。可以将手势文件放在sd卡的相应目录,也可以放在apk中一起打包。在本例中将gestures文件放在了工程目录的resaw目录中,因此,这个手势文件是包含在apk文件中的。
下面在oncreate方法中装载这个手势文件,**如下:
@override
public void oncreate(bundle s**edinstancestate) {
setcontentview(
edittext = edittext)findviewbyid(
从resaw目录中装载gestures文件
gesturelibrary =
如果成功装载手势文件,获得gestureoverlayview对象,并向该对象注册事件 if(
settitle("手势文件装载成功。")
gestureoverlayview gestures = gestureoverlayview) findviewbyid(
Android学习笔记
1 stringbuffer的使用 stringbuffer类和string一样,也用来代表字符串,只是由于stringbuffer的内部实现方式和string不同,所以stringbuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于string类。所以在实际使用时,如果经常需要对一个...
android学习笔记
目录。1 拨号器。2 短信发送器。3 单元测试1 4 单元测试2 5 文本文件读写。6 跨应用文件访问。7 访问sd卡。8 dom解析xml 9 sax解析xml文件。10 使用pull解析xml文件。11 共享首选项。12 跨包访问共享首选项。13 编程式布局。14 sqlite数据库操作。15 ...
Android学习笔记
android学习笔记 mars 1 android环境搭建。a adt bundle windows x86 b 配置环境变量 虚拟机运行的环境变量 随便整一个 i.android sdk home c android work d 2 android目录结构。a src 源文件 j a b as...