近些年来,随着3G 网络的大规模建设和智能手机的迅速普及,移动互联网时代已经到来。作为Google 推出的一款操作系统,Android 自问世以来就吸引了人们广泛的关注,受到众多厂商和开发者的青睐。Android 是一个开放、完整、免费的手机平台,强大的开源特性吸引了越来越多的开发者,Android的版本如今已由最初的1.1 升级到最新的4.0,功能越来越强大,用户体验越来越好,在Android 平台上发布的应用产品更加丰富多彩。
Android 平台上的应用越来越多,人们对应用的要求越来越高。现阶段触屏手机是趋势,触摸是人们与应用交互的主流方式,人们对触摸的灵敏度,简易性和方便度要求越来越高,有必要优化应用的触摸效果。
1 Android 平台的触摸机制
一般而言,事件是用户与UI(图形界面)进行交互的时候所触发的操作。例如在手机屏幕上触摸特定的区域就会触发对应的事件,在Android 中这些事件将被传送到事件处理器,它是一个专门接受事件对象并对其进行翻译和处理的方法。
在 Android 中用户事件响应是很重要的,用户消息主要来源于3 种硬件外部设备:触摸响应(ONTouch系列方法)、按键响应(onKey系列方法)和轨迹球(Trackball)。不论我们是通过触摸方式与屏幕交 互,还是使用轨迹球来交互,任何与屏幕相关的交互都是与屏幕相应位置上的视图控件的交互。现在 Android 系统的手机几乎全是触屏,基本的按键越来越少,触摸屏响应成为发展的大趋势,所以在应用设计的时候主要考虑触摸的效果问题,着重优化用户触摸响应。
图1 Android 平台用户消息处理流程
图 1 详细说明了各种用户操作被系统捕获的过程。系统捕获用户的响应后,由Linux 驱动捕获用户的消息,经过Android 框架层的AcTIvity Manager 的作用传递给Activity中的系统方法,通过执行相应的系统方法更新View 类,消息传递至Application Framework 层,最后调用Linux 驱动,控制着界面的绘制和更新。在Android 工程中,触摸相关的接口函数主要封装在android.view.KeyEvent 类中,写触摸屏操控的时候首先导入该类的包,在Activity的子类中对该方法进行说明即可。Android 的事件处理机制相对简单,对于事件处理机制不必详细理解,实现各种响应时只需具体实现各个方法即可,各个方法的具体实现在View类中进行,下面着重说明 Android 平台触摸响应的实现。
2 Android 平台触摸响应的实现
一般而言在 Android 中,对于触摸事件的处理如同UI 事件一样,主要通过两种方法来处理,一种是利用View 类的onTouchEvent()方法,一种是实现OnTouchLiSTener 接口的onTouch()方法。系统中当这两种方法都存在的前提下,系统将会优先采用OnTouchListener接口回调方法进行处理。一般在简单的 UI 设计界面重写onTouchListener()方法,涉及到多个Activity 切换时在方法中实现Activity 信息保存与跳转即可。
对于大型应用而言,界面状态比较复杂,触摸响应需要详细处理,系统提供了一个专门用于处理用户触摸事件的接口函数onTouchEvent()。实际开发过程中只需先声明此接口函数,然后在主View类中重写该函数实现具体的触摸效果即可。下面是接口函数的声明:
触屏监听方法中只有一个MotionEvent event 参数,此类的实例中保存了玩家触屏的各种动作,常见的有:按下动作、移动动作、多点触屏、屏幕压力等,在此类中定义了很多动作的静态常量值,通过 event.getAction()方法获取玩家的动作与所需动作常量值进行匹配。
上面是声音界面的触摸响应处理:event.getAction()是键控的类型,是MotionEvent 类的系统方法,获取当前的触摸响应。当向下触摸屏幕时,就响应MotionEvent.ACTION_DOWN这个动作,当触点满足给定的区间范围,就执行相当的操作,实现游戏的状态跳转。触摸范围在划分的时候最好以屏幕的相对位置为参考点,这样在应用横竖屏的处理或者应用移植的时候会更方便,避免了频繁 修改参考坐标的值。在程序入口处继承Activity 的子类中可以获取当前设备屏幕宽和高的具体属性,这样触摸范围确定时以屏幕的宽和高的属性值来定位就可以了。整个触摸部分的流程图如下:
图2 触摸屏操作响应的具体流程
图 2 显示的是游戏过程中触摸屏幕时具体的响应流程,主要涉及到Activity 类和View类。在Activity 类中进行触摸方法onTouchEvent()的声明,在View 类中对该方法进行详细定义和说明。当触摸响应后,触发事件响应机制,event 对象通过getAction()方法获取触摸响应,获得当前的触摸点坐标event.getX()和event.getY(),与方法中的触摸范围进行判断,若在区域内则执行触摸响应。触摸响应执行后需要在触摸释放MotionEvent.ACTION_DOWN进行触摸释放的处理,及时释放当前的触摸响应。
3 Android 平台触摸响应的优化
值得注意的是,上面触摸响应MotionEvent.ACTION_DOWN 中,特意定义了一个临时触摸计数变量keyCount,当计数变量加到一定的程度时候才执行触摸响应。这样处理能有效地防止连续触摸响应,触摸不释放而直 接跳到下一个状态,触摸变量的设置在各个界面跳转过程中尤其是游戏菜单中各界面跳转中是很有必要的。
触摸响应中除了各个菜单界面的响应以外还有一个重要的响应就是游戏中对主角的操控。主游戏界面的触摸响应原理和菜单界面是一致的,不同的是触摸判断 范围的选取有差异,菜单界面各个触摸范围是固定的,而游戏界面触摸区域的划定是动态的。由于在角色扮演等游戏中主角是核心人物,因此对主角的操控的触摸响应显得尤其重要,进行触摸设计的时候一般以主角为中心进行设计,以主角的坐标作为基本点来判断。
图3 主角控制时区域的划分
图 3 所示的是主角移动时候的区域划分,以水平和垂直坐标轴的交点作为主角的坐标中心点,将主角周边的区域划分为10 个区域,触点在区域9-10 的时候方向向右,对称的区域5-6 的时候方向向左,区域7-8 的时候方向向下。对于区域1-4 进行进一步的划分,2-3 区域方向向上,只响应向上的操作,区域1 同时响应右键和上键,区域4 同时响应左键和上键。这样对区域进行细化符合实际情况,区域1 和区域4 的角度范围可以根据实际情况微调。
以主角为中心划分主角周边的区域以后,斜上方区域响应斜上方的键控,即响应上键的时候同时响应左键或者右键;右边区域响应右键;上下区域分别响应上 和下键,响应按键后执行对应的触摸按键操作,这样按照区间划分区域具有很好的用户体验。这的注意的是,主角操控的触摸键控一定得对应触摸按键的释放,要不然系统接收用户的触摸响应后对应的逻辑会一直执行下去。当event.getAction()状态为MotionEvent.ACTION_UP 时执行触摸按键的释放,触摸按键释放的操作如下:
if ((player.keyStatus & SonicPlayer.KEY_LEFT) == SonicPlayer.KEY_LEFT)
{player.keyUp(SonicPlayer.KEY_LEFT);}//释放具体的触摸响应
触摸屏接口设计模块的改进在于根据主角的中心点细化区域,然后根据划分的区域执行相应的操作,同时在触摸的响应时增加了计数变量。
4 结论
Android 平台的触摸响应是非常重要的,本身的触摸事件处理机制比较复杂,但是触摸响应实现时非常简单,只需实现相关方法即可。应用的触屏响应主要分为菜单界面的触摸响应和游戏界面的触摸响应,这两部分的实现机制是相同的,只不过划定触摸范围的方法不同。
在菜单各个界面中主要依靠菜单中各个图片相对屏幕的像素位置来确定触摸范围,然后实现触屏响应;在游戏界面主要以主角为中心,根据上述的区域范围划分来确定触摸范围和相应的操作。在实现触摸方法的过程中,触摸临时计数变量的设置非常必要,起到缓冲的作用,防止一次触摸键控不释放引发多个界面的响应。 本论文主要对Android 平台的触摸响应进行了实现和优化,大大增强了用户体验,具有很强的应用价值。
|
||||||
|
||||||