Android statusBar增添back,home,menu按钮
在Android 界面的系统status bar 上添加home,back,menu 三个菜单,并完成对应的系统功能。并有higlight 效果,修改status bar 高度和status bar 上的文字尺寸。
这需要修改android sdk 才能完成, 我用的是eclair. 下面就我的操作进行叙述。
1. 首先完成界面显示效果。
需要修改文件
./frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java, 仿照mBatteryIcon 等icon 的添加方式添加自定义的icon ,图片名称指定就好了。另外还要记得修改./frameworks/base/core/res/res/values/arrays.xml ,这里定义了icon 的slot, 并且决定了icon 的摆放顺序。
这样,你需要的icon 按键就可以显示在系统的status bar 上面了。
2. 判断touch event 是否按动了某个icon
需要修改的文件
./frameworks/base/services/java/com/android/server/status/StatusBarView.java
首先在onTouchEvent 函数中,获取当前event 的坐标,然后比较是否在某个按键范围之内。由于系统对于statusBar 的范围已经有了定义,所以这里只需要比较横坐标就可以了。
其次,也是这一步最关键的,怎么获取具体某一个icon 的左右边界坐标呢?系统的status bar 左边显示的图标都是notification, 右边显示的是系统icon. 也就是说左边icon 属于mNotificationIcons ,右边的icon 属于mStatusIcons. 在文件StatusBarView.java 中出现的offset = getViewOffset(mStatusIcons) ,得到mStatusIcons 的最左边的icon 的left 横坐标。用N = mStatusIcons.getChildCount() 得到共有几个系统icon, 其中包含visibility 为false 的icons. 用mStatusIcons.getChildAt(N-i) 得到的是从右边数第i 个的icon view. 这个view 的getLeft()+offset 就是这第i 个icon 的左边横坐标,对应的getRight()+offset 就是这第i 个icon 的右边横坐标。本例中home键是右边第2个icon.
3. 定义icon 响应事件
这里使用的方法是在StatusBarView.java 中向
./frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java 发送一个Broadcast, 让StatusBarPolicy 来完成具体的事件操作。这里需要注意的是不仅要在./frameworks/base/core/java/android/content/Intent.java 中定义intent, 还要在StatusBarPolicy 的构造函数中添加该intent 的过滤动作,即filter.addAction(Intent.ACTION_BACKICON_CHANGED). 例如,按动了back 键,如果当前事件为action_up, 就向系统发送一个keyEvent ,keyCode 为KeyEvent.KEYCODE_BACK. 这里借用的是./frameworks/base/cmds/input/src/com/android/commands/input/Input.java 中的sendKeyEvent 函数,直接拷贝过来,按照需要稍微修改一下形参就可以了,过程不要修改。
需要说明的是,当点击statusBar 可以拉出来一个notification 列表,当这个列表显示出来的时候,这三个back, menu, home 键的响应速度会非常慢,所以这时不响应事件并隐藏这三个键。具体做法是在StatusBarView 的onTouchEvent() 中判断mService.mExpanded 或者 mService.mTracking 为真时就不做响应。mService 是StatusBarService 对象。隐藏三个键也是用Broadcast 来做的,但这个intent 是由StatusBarServie 发出来的,当mExpandedVisible = false 时显示,当mExpandedVisible = true 时隐藏。
这里还同时完成了highlight 换图的动作,也是用Broadcast 来做得,处理过程一样,就是需要区分action_down 和action_up 就可以了。
4. 调整status bar 的高度
如果你需要显示较大的屏幕尺寸,同时statusBar 的高度要拉大,上面的icon 的size 也需要调大。为了协调一致,显示时间的字体和notification 显示的日期的字体也需要调大。具体做法如下:
a. 调节status bar icon 的size: 只调节status_bar.xml 的textSize 标签似乎不起作用,同时又修改了./base/services/java/com/android/server/status/StatusBarIcon.java 的t.setTextSize(32); 语句才成功。不知道修改status_bar.xml 的<com.android.server.status.AnimatedImageView> 标签下的layout_height 值是不是必须的,反正我是一起都给改了。
b. 调节status bar height: ./base/core/res/res/values/dimens.xml 找得我好辛苦!不知道还需不需要修改./base/core/res/res/values/themes.xml 中的Window attributes 的windowTitleSize 值,反正我也给改了。
c. 调节notification 显示日期字体的大小,修改status_bar.xml 的<com.android.server.status.DateView> 的textSize 值。
到这里,就完成了所有工作,看看效果吧。