曾经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的行为,在不同的按键阶段显示不同的图片。

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

更多相关文章

  1. 新书出版:《Android深度探索(卷1):HAL与驱动开发》
  2. Android(安卓)Studio如何设置自己主动提示代码
  3. 浅谈Android与Linux系统的差异
  4. EditText横屏时,弹出软件盘时不进行全屏
  5. EditText横屏时,弹出软件盘时不进行全屏
  6. Android(安卓)Binder机制之 ServiceManager的启动
  7. android eclipse 真机调试
  8. 【Android(安卓)内存优化】Bitmap 长图加载 ( BitmapRegionDecod
  9. EditText横屏时,弹出软件盘时不进行全屏

随机推荐

  1. Android里merge和include标签的使用
  2. 直接从 Google Play 下载 Android(安卓)
  3. 编译可在Android上运行的glib库
  4. Android基础与手机历史
  5. androidhttp网络通信
  6. Android(安卓)Permission那些事
  7. Android(安卓)SMS(二)—— 读取短信保存到
  8. 修改Android(安卓)app图标(Android(安卓)
  9. android:configChanges属性
  10. 详解Android短信的发送和广播接收实现短