BREW触摸屏开发参考

来源:互联网 发布:中走丝编程软件 编辑:程序博客网 时间:2024/04/29 13:57
触摸屏开发参考 V0.1

1、 BREW触摸屏接口


处理触摸屏事件与处理按键事件过程大体相同,只不过是事件的名称和事件参数的含义不同而已。


例如,大部分手机的触摸屏事件是这样定义的


EVT_PEN_DOWN触摸笔按压屏幕

EVT_PEN_MOVE触摸笔在屏幕上移动

EVT_PEN_STALE_MOVE??

EVT_PEN_UP触摸笔从屏幕上离开


事件参数dwParam存储了事件发生时触摸笔在屏幕上的坐标。其中高16位是x,低16位是y。


事件处理的入口仍然是注册的HandleEvent函数。


从上面的事件和参数说明看出,我们只要知道模拟器或手机发送的触摸屏事件值,就完全可以接收和处理了。触摸屏事件在BREW SDK 3.1.5 SP01之前和之后,各有一套推荐值。有些手机甚至自己定义了事件值。事件参数的存储形式也是不一样的。每款手机的具体信息可以在这个手机的dpk包里找到。如果没有特别注明的话,那就应是该手机BREW版本相应的推荐值了。已知的事件值和参数取出方法,也可在本文的附录中找到。


如果使用BREW SDK 2.0开发,我们可以把找到的事件值用#define定义在程序中。用与该套事件值对应的方法取出事件参数。


2、 支持触摸屏的模拟器


  BREW SDK 3.1.5 SP01附带的模拟器支持触摸屏操作,是开发过程中要经常使用的。这个模拟器只发送EVT_POINTER_XXXXX这样的触摸屏事件,参数的取法也与上面介绍的不同。详细情况可见附录。


  有些手机的dpk包中附有专门针对该款手机修改过的模拟器,真实模拟该款手机发送的触摸屏事件和输入法情况。例如coolpad C528和Daxian C8000。


3、 BREW控件


BREW控件是由模拟器或手机实现的。只要该模拟器或手机支持触摸屏操作,这上面的BREW控件也就支持。例如ITextCtl, 我们只需要把eCode和wParam,dwParam传给ITEXTCTL_HandleEvent,而不用管这个eCode具体是按键事件还是触摸屏事件。


一般的控件,例如IMENUCTL,只要保证传入所有的触摸屏事件和COMMAND事件就可以了。这里不能只传入按下(DOWN)事件,因为有些操作是靠UP和MOVE触发的。


触摸屏输入法较特殊。在一般触摸屏手机上,输入时都需要调出一个软键盘。实验发现,如果只将触摸屏事件和COMMAND事件传给ITextCtl,在有些手机上就无法调出软键盘。这种手机一般都有自己定义的事件来调出软键盘。因此,如果控件处于激活状态,就应将最外层HandleEvent接受到的所有事件传给ITEXTCTL_HandleEvent函数。


4、 开发建议


a.  因为快速包不允许修改程序,尽量使同一个程序可以在触摸屏事件定义不同的手机上都正常运行。例如利用配置文件。

    case EVT_POINTER_DOWN:

    case EVT_PEN_DOWN:

    ...处理...

    break;

这种写法在某些新手机上可能会有问题。为保证兼容性,一次点击,在这些手  机上会同时发送POINTER,PEN这两种事件。会有重复处理的问题。


b. 低版本的触摸屏事件参数只包含位置信息。高版本的还包括是否双击这样的额外信息。如果需要使用这些信息,最好自己编写实现,避免高低版本处理不同。


c. 中断返回时很可能接受不到Up事件,要注意对这种情况的处理。


d. 如果是将非触摸屏版本改为触摸屏版本的话。可以考虑利用原先的按键处理程序,例如将触摸屏事件转换为相应的按键事件处理。


e. 即使不是开发触摸屏应用,也应在程序设计上有所考虑,方便以后扩充触摸屏功能。例如自己写控件上,即使现在只接受EVT_KEY,也应传入eCode。


5、策划建议


   有些手机没有MOVE事件;有些手机发送UP事件时没有触摸笔位置信息;有些手机触摸屏边缘的位置信息不准确;现阶段策划中应予以考虑。

   例如:

   a. 避免拖放,或者支持拖放的同时设计点击操作完成同样的功能。

   b. 一般windows上的鼠标处理过程,是按上后变形变色,抬起后再确认执行操作。有些·手机因为抬起事件无参数,无法这样处理。

   c. 滚动条,关闭按钮这些离屏幕边缘近的触摸区域应尽量大一些。


附录:


1已知触摸屏事件

(以下XXXXX表示DOWN,UP,MOVE,STALE_MOVE)


a. EVT_PEN_XXXXX

老版本的触摸屏事件。在BREW SDK 3.1.5 SP01以后已不被高通推荐。但为保持兼容性,在新版本中发送新定义的触摸屏事件时仍会同时发送这类事件。参数dwParam中仅有位置信息。高16位是x,低16位是y。事件值如下:

#define EVT_PEN_DOWN              0x504 

#define EVT_PEN_MOVE              0x505 

#define EVT_PEN_UP                 0x506 

#define EVT_PEN_STALE_MOVE      0x507 


b.EVT_POINTER_XXXXX

高通推荐的触摸屏事件类。在BREW SDK 3.1.5 SP01中有定义。参数dwParam是一个字符串指针。字符串里面含有触摸位置,是否双击等信息。获得这些信息有相应的函数,例如AEE_POINTER_GET_X。这些函数定义在BREW SDK 3.1.5 SP01中的AEEPointerHelpers.h里。可以拷贝到自己的工程里面使用。

#define EVT_POINTER_DOWN           0x50b

#define EVT_POINTER_MOVE           0x50c

#define EVT_POINTER_UP              0x50d

#define EVT_POINTER_STALE_MOVE   0x50e


c.EVT_PEN_W559_XXXXX

三星W559手机自己定义的触摸屏事件。参数与EVT_PEN_XXXXX相同。事件值如下

#define EVT_OEM_START            0x5800   

#define EVT_OEM_END              0x5fff   

#define BREW_EVT_BASE  (EVT_OEM_START)

#define EVT_PEN_W559_DOWN (BREW_EVT_BASE)

#define EVT_PEN_W559_UP (BREW_EVT_BASE + 1)

#define EVT_PEN_W559_MOVE (BREW_EVT_BASE + 2)


2、已测各款手机触摸屏特性


LG KW838 

同时发送EVT_POINTER_XXXXX和EVT_PEN_XXXXX。

可能是这款手机速度太快,测试员感觉是一次的触摸,手机却总是会发送两次相同的事件。


Moto A1800 

发送EVT_PEN_XXXXX事件。


三星W599 :

发送EVT_PEN_XXXXX事件,同时发送AVK_FUNCTION5按键事件。

输入法小键盘会被ITextCtl控件挡住。

屏幕边缘触摸坐标与显示坐标不一致,且偏离程度与高度有关。


三星W559 :

发送EVT_PEN__W559_XXXXX事件,同时发送AVK_STOP按键事件。

输入法小键盘会被ITextCtl控件挡住。

测试员传送EVT_PEN_W559_XXXXX事件给BREW控件。但除了输入法小键盘外,其余控件均不响应。

显示坐标与触摸感应坐标不一致

    x(显示)=x(触摸)

       y(显示)≈y(触摸) – 24


Coolpad C528 

发送EVT_PEN_XXXXX事件

IhtmlViewer控件不支持触摸屏操作。


大显C8100 :

发送EVT_PEN_XXXXX事件

没有EVT_PEN_MOVE事件


海信D90 :

同时发送EVT_POINTER_XXXXX和EVT_PEN_XXXXX事件。

但控件只处理EVT_PEN_XXXXXX事件。

软键盘会出现在屏幕下方。ITextCtl要覆盖到这个区域,软键盘才会相应。(不十分确定)。


UT CD500 :

同时发送EVT_POINTER_XXXXX和EVT_PEN_XXXXX事件。

但控件只处理EVT_POINTER_XXXXXX事件。


阿尔卡特OT-S659 :

同时发送EVT_POINTER_XXXXX和EVT_PEN_XXXXX事件。

但控件只处理EVT_POINTER_XXXXXX事件。


33.1.5模拟器注意事项

目录或文件不要用中文名,全部小写。

注意大小限制。Mif和模拟器使用的device都有关于文件大小的限制。

数据库格式格式与2.X不同。(不确定)

当触摸点从屏幕边缘划出屏幕外时,模拟器不会发出Up事件。而在有些真机上是会发出的。


参考文献

《Coolpad C528 Develop Reference》

BREW 3.1.5 SP01 触摸屏功能使用》

《高通触摸屏示例源代码》

原创粉丝点击