Navigation bar是google 从4.0版本开始支持的feature,默认情况下这个feature对应的option是关闭的,需要通过修改config 文件来开启。开启navigation bar的方法和注意事项,请参考FAQ:如何开启navigation bar。
如果想要做到,在开启navigation bar的情况下,可以透过navigation bar的背景看到navigation bar后面的内容(也就是修改navigation bar为半透明),应该如何修改?
修改前后的效果图对比如下:
修改前 修改后
[SOLUTION]
1,alps\frameworks\base\packages\SystemUI\res\layout\navigation_bar.xml,
把background修改成statusbar_background的背景图:
android:background="@drawable/statusbar_background"
2,制作一张半透明的9.png图片,名字叫statusbar_background.9.png,放到
alps\frameworks\base\packages\SystemUI\res\drawable-hdpi下
3,alps\frameworks\base\packages\SystemUI\src\com\android\
systemui\statusbar\phone\PhoneStatusBar.java
修改方法getNavigationBarLayoutParams,如下:
- private WindowManager.LayoutParams getNavigationBarLayoutParams() {
- WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- . . .
- /*PixelFormat.OPAQUE*/ PixelFormat.TRANSLUCENT); //mtk added
private WindowManager.LayoutParams getNavigationBarLayoutParams() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
. . .
/*PixelFormat.OPAQUE*/ PixelFormat.TRANSLUCENT); //mtk added
4,WindowManagerService.java中
修改方法updateWallpaperOffsetLock,如下:
- boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int
- dh,boolean sync) {
- . . .
- if (wallpaperWin.mYOffset != offset) {
- if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
- + wallpaperWin + " y: " + offset);
- changed = true;
- wallpaperWin.mYOffset = offset; // 修改成wallpaperWin.mYOffset = 0;
- }
- . . .
boolean updateWallpaperOffsetLocked(WindowState wallpaperWin, int dw, int
dh,boolean sync) {
. . .
if (wallpaperWin.mYOffset != offset) {
if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
+ wallpaperWin + " y: " + offset);
changed = true;
wallpaperWin.mYOffset = offset; // 修改成wallpaperWin.mYOffset = 0;
}
. . .
对于JB的版本,还需要修改:
5, WindowManagerService.java
修改方法performLayoutLockedInner,如下:
- private final void performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
- if (!mLayoutNeeded) { …
- for (i = N-1; i >= 0; i--) {
- final WindowState win = mWindows.get(i);
- //mtk added
- If (win.mIsWallpaper)
- mSystemDecorRect.bootom = 屏幕高度; //以480*800分辨率来说,这里的屏幕高度就是800
- //mtk added
- …
- }
private final void performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
if (!mLayoutNeeded) { …
for (i = N-1; i >= 0; i--) {
final WindowState win = mWindows.get(i);
//mtk added
If (win.mIsWallpaper)
mSystemDecorRect.bootom = 屏幕高度; //以480*800分辨率来说,这里的屏幕高度就是800
//mtk added
…
}
注意:
修改navigation bar半透明后存在的限制:
- 从那些以wallpaper作为背景的画面(画面对应的window具备属性:FLAG_SHOW_WALLPAPER)切换到不显示wallpaper的画面,会在navigation bar的背景上先闪一下wallpaper,然后navigation bar的背景才变成黑色。
- 如果希望某些特定的window才可以让navigation bar半透明,其他window上navigation bar仍然不透明,例如:只在launcher画面做到navigation bar半透明,其他画面navigation bar仍然保持原来的风格,目前不做支持。
- WVGA上开启navigation bar本身就有很多问题,建议不要在WVGA分辨率下开启navigation bar功能。
- Navigation bar半透明的功能只针对当前的wallpaper是ImageWallpaper的情况,对Live Wallpaper不生效,后续也不做更多支持。