`
gaofen100
  • 浏览: 1190189 次
文章分类
社区版块
存档分类
最新评论

回顾 android 1.6下的 virtual key

 
阅读更多

曾经android 不支持virtual key。好像是2.0以后才有的virtual key的吧。virtual key顾名思义就是利用触摸屏的一个区域,模拟成按键,最终被android framework理解成按键事件。

再说说,那时候的项目背景。当时android2.0还没出来,公司也是对android比较感兴趣。其实公司对android并不是十分技术雄厚,很多东西都在总结和积累阶段。一天,上司说从日本来了一块电路板,基于imx35的。本来是没什么,就是为了学习android的。后来,经理不知怎么谈的,说做一个好一点的,去参加日本东京的展览会。这下急坏了底下的人。其中,最郁闷的是,该死的日本鬼子竟然板子上除了电源键,没有其他按键。

起初,很无奈,怀疑自己能不能完成这个课题。由于当时也是接触android不久,所以对framework理解不深,虽然在方案提出阶段,也有修改framework的考虑,但最终还是pass掉了。

自己有驱动的基础,基本上除了网络协议之外,其他驱动都有了解。最终,从android跟驱动的接口上下功夫了。

第一步,修改hal层,改变报告给framework的有效区域的大小,留出virtual key的空间。这样android在显示时,就不会把图像显示到virtual key上。 这个修改主要在hardware目录中。

第二步,增加虚拟按键驱动。在rootfs中设置一个配置文件,包含了位置和键码的对应关系。在虚拟按键驱动加载时,读入驱动的内核空间,驱动根据配置文件中的对应关系,当触摸了指定区域,向上发送对应键码。 虚拟按键驱动创建了一个按键类型的input节点,这样android就认识他了,自动读取按键事件。触摸屏的驱动也需要调整,把某些区域的坐标数据发送给按键驱动。

第三步,增加图片。虽然虚拟按键驱动可以完成功能,但是在virtual key区域是黑色的,什么也没有。这时需要一个daemon程序完成图片显示和切换。这个daemon程序,根据按键驱动发送来的键码,更新显示区域的图片。每个按键都有两幅图片,按下和抬起。首先,制作图片,使其大小跟virtual key区域匹配。其次,移植lib jpeg,利用这个库解压图片。最后,把解压后的数据写入framebuffer缓冲区。 这里有个问题,就是android的双缓冲机制,就是android 刷新屏幕时,对交替显示其中一个缓冲区。如果不注意这个机制,那么virtual key的button图片就会闪烁,一会显示,一会变黑。所以就要在映射framebuffer的缓冲区时,把两个空间都映射进来,写的时候同时写。注意计算button在framebuffer缓冲区的起始位置。

经过这三步,在android1.6屏幕的下方,多了一个漂亮的control bar,可以控制android的行为,在不同的按键阶段显示不同的图片。

最终,这个项目得到日本公司的赞赏。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics