作者:温尚书,华清远见嵌入式培训中心讲师。

Tag:海豚浏览器 dolphin browser 手势 手势操作 手势输入 Gesture GestureLibrary

海豚浏览器是由国人推出的一款移动浏览器,自2010年推出后,即逐渐在国外引起较大的反响。它提供了人性化、流畅的用户体验。其中有一个用户手势控制功能,更是引起了大家很大的关注。

下面我们先来看看海豚浏览器的这个功能,如下图所示,如果我们在其中用手指输入一个“S”,它将会打开预先定义好的和这个手势相对应的网址。

那么,如何实现它的手势功能呢?下面我们一步步来实现这个功能。

首先,我们需要先定义一个“手势-字符串”对应的手势库(GestureLibrary),我们可以用Android AVD中自带的一个工具来实现自定义手势库的功能。如下图左所示,在AVD(即手机模拟器)中打开Gesture Builder这个应用,即可在这里定义手势和其对应的名称(字符串),如下图中所示。下图右是自己定义好的手势和它的对应的名称列表。

这里定义的手势库会将其保存到一个文件中,默认情况下保存在/mnt/sdcard/gestures这个文件中,可以将这个文件从AVD对应的文件系统下倒出来,然后,放入要用到手势处理的项目中,一般把它放到/res/raw这个目录下。

当定义好并且将手势库放到项目中后,我们就可以使用这些手势了。使用手势的基本思路是,提供一个视图(View),让用户可以在此用手指在屏幕上画出手势,然后,根据用户画出的手势,和我们签名定义的手势库里的手势进行匹配,如果能找到相匹配的手势,则根据这个手势找到其对应的名称,然后根据这个名称,来进行不同的处理。

和手势处理相关的几个类如下:

●    GestureLibrary:用于表示单个的手势库;
        ●    GestureLibraries:用于表示所有的手势库,可以通过它来得到单个的GestureLibrary;
        ●    Gesture:表示一个手势;
        ●    Prediction:它封装了和手势相关的两个属性:对应手势的名称(name),以及用户画出的手势图形和手势库中相匹配的手势图形之间的相似程度(score);
        ●    OnGesturePerformedListener:用于监听用户在屏幕上的手势操作的一个监听接口。
        ●    GestureOverlayView:用于接收用户的手势操作的一个视图(View),它位于android.gesture包下面,而不是android.widget包下面。

下面我们自己来实现一个自定义手势功能。

首先,我们要在需要用到手势的界面中,加入GestureOverlayView这个视图。正如它的名字所展示的一样,它可以覆盖在其他视图上面,不进行手势操作的时候,对用户并不会构成干扰。

下面是对应的Layout中的设置:

<LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignParentBottom="true"
                android:layout_below="@id/divider" >

<!-- 添加手势处理 -->

<android.gesture.GestureOverlayView
        xmlns:android="http://schemas.android.com/apk/res/android"
                        android:id="@+id/gestures1"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:layout_weight="1"
                        android:eventsInterceptionEnabled="true"
                        android:gestureStrokeLengthThreshold="12"
                        android:gestureStrokeType="multiple"
                        >

<ListView
                                android:id="@+id/listView1"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content" >
                        </ListView>
                </android.gesture.GestureOverlayView>
        </LinearLayout>

这样,我们就在ListView上添加了一个手势输入视图GestureOverlayView了,以为它不在android.widget包中,所以这里需要写上全路径。对于GestureOverlayView的一些属性,说明如下:

1)gestureStrokeType:设置画笔(Stroke)的类型。大多数情况下,gestures都是通过一笔完成。然而有一些特别的需求就需要通过多个笔画来实现,例如通过“+”来实现“添加”的行为,则可以将其值设置成“multiple”,如果是单一笔画,则可以将其值设置成“single”。

2)eventsInterceptionEnabled: 可以简单理解为当前应用程序在Gesture overlay模式下屏蔽其它Views Events的开关。当它设置为true时,所有基于当前应用程序屏幕的操作都被视作为绘制gestures的行为,从而避免用户与应用程序界面的交互造成混乱。

3)orientation:这个属性作为当前Gesture recognizing的参考标准(相当于filter的作用),例如:在这个例子中的Items垂直排列,所有基于Overlay的垂直 (vertical) gesture,都无法被识别为有效的gesture,其与当前的垂直滚动条操作造成混淆。对于水平 (horizontal) gesture可以立即识别为有效的gesture,或者任何以垂直为起始的操作需要至少包含一段水平的绘制轨迹才可以被正常识别。

4)gestureColor:画笔的颜色,可以设置成“#rgb”、“#rrggbb”、“#argb”或者“#aarrggbb”各种格式中的一种。

在Layout中设置好用于接收手势收入的GestureOverlayView以后,就可以在程序中对用户的手势操作进行处理了。

首先,我们要将我们预先定义的手势库装入进来,如下:

GestureLibrary        gesLib         = GestureLibraries.fromRawResource(this, R.raw.gestures);
        gesLib.load();

然后,在GestureOverlayView上加上手势处理监听器:

gestureoverlay1
                        .addOnGesturePerformedListener(new MyOnGesturePerformedListener());

在MyOnGesturePerformedListener中,实现其onGesturePerformed回调方法,它有2个参数: 第一个参数GestureOverlayView,此处指的是触发Gesture事件的GestureOverlayView对象,第二个参数Gesture,封装的是用户输入的手势操作。我们得到这个Gesture对象后,即可使用它跟我们预先定义的手势库中的手势进行匹配,它将会返回一个ArrayList类型的Prediction列表,将所有和它匹配的手势信息都放到里面,且其匹配程度从高到低排列:

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

然后,我们既可以根据Prediction中的名称(name)和相似程度(score)来对用户输入的手势做出响应。

if (predictions.size() > 0) {
        //只要取出最相似的那个手势即可
                rediction prediction = predictions.get(0);
                if (prediction.name.equals("add") // 手势名称是“add”
                                && prediction.score > 3.0) {// 用户手势和定义好的手势库中的手势相似程度
                                                //do something
                }
        }

嵌入式及3G相关资源及学习请点击:嵌入式开发视频 android开发视频 android培训 3G培训 QT培训 QT开发视频 物联网培训 物联网技术视频 嵌入式学习

在Android应用中加入自己的手势处理相关推荐

  1. Android应用中加入自己的手势处理

    原文http://www.embedu.org/Column/Column437.htm 海豚浏览器是由国人推出的一款移动浏览器,自2010年推出后,即逐渐在国外引起较大的反响.它提供了人性化.流畅的 ...

  2. android view gesturedetector,如何在Android中利用 GestureDetector进行手势检测

    如何在Android中利用 GestureDetector进行手势检测 发布时间:2020-11-26 16:15:21 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关如何在Andro ...

  3. Android中添加和识别手势操作

    实现思路:将手势写入GestureLibrary中,对其他手势进行匹配对比,进行识别 先在布局中加入GestureOverlayView组件 <android.gesture.GestureOv ...

  4. android 按钮手势,如何在Android 10中使用手势导航或如何关闭它

    谷歌移动操作系统的最新版本Android 10带有许多出色的新功能.在Android 9.0 Pie中向Android中引入了手势导航 - 它使用滑动和其他操作来控制手机,而不是点击按钮.在Andro ...

  5. android studio 顶部导航栏_Android10 手势导航开发与处理:边到边(I)

    这是我们有关"手势导航"系列的第一篇文章. 借助Android 10,已添加了新的系统导航模式,允许用户向后导航,导航至主屏幕并通过手势触发设备助手. Android 10 中新手 ...

  6. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

  7. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为: Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework. Framework层为我们开 ...

  8. Android 应用中十大导航设计错误

    2019独角兽企业重金招聘Python工程师标准>>> 大家好,这里是 2014 年第一期正式的 ADiA 教程.在上一次的设计错误文章里,我们已经简略的提过了一下导航设计上的错误, ...

  9. android studio 显示view树_Android手势分发和嵌套滚动机制

    前言   对于一个Android开发者而言,要开发一个APP你必须要了解事件分发,而要开发一个优秀的APP你就必须要理解嵌套滚动.   在Android的开发体系里面,手势体系是一块非常重要的内容.从 ...

最新文章

  1. wordpress更新时需要ftp的解决方法
  2. QT如何让窗口放置在屏幕正中间
  3. 网络编程第三讲UDP编写
  4. sklearn的KNN文档中实例代码的注释
  5. ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法
  6. 机器学习非监督学习—k-means及案例分析
  7. 高级语言程序设计c 华南理工,华南理工大学高级语言程序设计(C)期末练习题
  8. 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
  9. ztree 标准得json数据格式_酷站推荐 - json-c.github.io/json-c - json-c API
  10. java定时器参数_Java报表软件定时器参数之一
  11. 7.边缘检测:2D运算——Canny的不同结果、单个2D边缘检测滤波器、实现边缘3种方法Matlab实战_3
  12. 8.4 Change Reference to Value(将引用对象改为值对象)
  13. 关于FD.io VPP的最新消息
  14. Excel/WPS表格怎么设置输入密码才能打开文件
  15. (转帖)如何在DE2上安裝μClinux作業系統? (Nios II )
  16. HDoj 1862
  17. 北京政协:电子垃圾回收是亟待破解的难题
  18. 【信息技术】【2002.04】基于局部分割的数字图像处理
  19. Office2016打开文件提示“文件已损坏”,WPS打开却正常的解决办法
  20. dva 底层框架构建

热门文章

  1. vaadin_为什么我仍然爱Vaadin
  2. UE4C++采用官网方法实现多国语言的切换
  3. 如何让学习python像玩游戏一样上瘾
  4. 解决MoBaXterm网络连接超时问题Network error: Connection timed out
  5. 2017全国计算机教育大会,GCCCE 2017 全球华人计算机教育应用大会
  6. 【域泛化】2022 IJCAI领域泛化教程报告
  7. 命令行下使用matlab写函数,matlab定义函数【搞定方法】
  8. Pycharm激活方式
  9. 《学活Linux》第二讲——内核模块和驱动模型
  10. 青雀推出小程序服务矩阵 助企业抢占首波移动先机