在Android 界面的系統(tǒng)status bar 上添加home,back,menu 三個菜單,并完成對應(yīng)的系統(tǒng)功能。并有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 按鍵就可以顯示在系統(tǒng)的status bar 上面了,。
2. 判斷touch event 是否按動了某個icon 需要修改的文件 ./frameworks/base/services/java/com/android/server/status/StatusBarView.java 首先在onTouchEvent 函數(shù)中,獲取當前event 的坐標,,然后比較是否在某個按鍵范圍之內(nèi),。由于系統(tǒng)對于statusBar 的范圍已經(jīng)有了定義,所以這里只需要比較橫坐標就可以了。 其次,,也是這一步最關(guān)鍵的,,怎么獲取具體某一個icon 的左右邊界坐標呢?系統(tǒng)的status bar 左邊顯示的圖標都是notification, 右邊顯示的是系統(tǒng)icon. 也就是說左邊icon 屬于mNotificationIcons ,,右邊的icon 屬于mStatusIcons. 在文件StatusBarView.java 中出現(xiàn)的offset = getViewOffset(mStatusIcons) ,,得到mStatusIcons 的最左邊的icon 的left 橫坐標。用N = mStatusIcons.getChildCount() 得到共有幾個系統(tǒng)icon, 其中包含visibility 為false 的icons. 用mStatusIcons.getChildAt(N-i) 得到的是從右邊數(shù)第i 個的icon view. 這個view 的getLeft()+offset 就是這第i 個icon 的左邊橫坐標,,對應(yīng)的getRight()+offset 就是這第i 個icon 的右邊橫坐標,。本例中home鍵是右邊第2個icon.
3. 定義icon 響應(yīng)事件 這里使用的方法是在StatusBarView.java 中向 ./frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java 發(fā)送一個Broadcast, 讓StatusBarPolicy 來完成具體的事件操作。這里需要注意的是不僅要在./frameworks/base/core/java/android/content/Intent.java 中定義intent, 還要在StatusBarPolicy 的構(gòu)造函數(shù)中添加該intent 的過濾動作,,即filter.addAction(Intent.ACTION_BACKICON_CHANGED). 例如,,按動了back 鍵,如果當前事件為action_up, 就向系統(tǒng)發(fā)送一個keyEvent ,,keyCode 為KeyEvent.KEYCODE_BACK. 這里借用的是./frameworks/base/cmds/input/src/com/android/commands/input/Input.java 中的sendKeyEvent 函數(shù),,直接拷貝過來,按照需要稍微修改一下形參就可以了,,過程不要修改,。 需要說明的是,當點擊statusBar 可以拉出來一個notification 列表,,當這個列表顯示出來的時候,,這三個back, menu, home 鍵的響應(yīng)速度會非常慢,所以這時不響應(yīng)事件并隱藏這三個鍵,。具體做法是在StatusBarView 的onTouchEvent() 中判斷mService.mExpanded 或者 mService.mTracking 為真時就不做響應(yīng),。mService 是StatusBarService 對象。隱藏三個鍵也是用Broadcast 來做的,,但這個intent 是由StatusBarServie 發(fā)出來的,,當mExpandedVisible = false 時顯示,當mExpandedVisible = true 時隱藏,。 這里還同時完成了highlight 換圖的動作,,也是用Broadcast 來做得,處理過程一樣,,就是需要區(qū)分action_down 和action_up 就可以了,。
4. 調(diào)整status bar 的高度 如果你需要顯示較大的屏幕尺寸,同時statusBar 的高度要拉大,,上面的icon 的size 也需要調(diào)大,。為了協(xié)調(diào)一致,顯示時間的字體和notification 顯示的日期的字體也需要調(diào)大,。具體做法如下: a. 調(diào)節(jié)status bar icon 的size: 只調(diào)節(jié)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. 調(diào)節(jié)status bar height: ./base/core/res/res/values/dimens.xml 找得我好辛苦,!不知道還需不需要修改./base/core/res/res/values/themes.xml 中的Window attributes 的windowTitleSize 值,反正我也給改了,。 c. 調(diào)節(jié)notification 顯示日期字體的大小,,修改status_bar.xml 的<com.android.server.status.DateView> 的textSize 值。 到這里,,就完成了所有工作,,看看效果吧。 |
|