现在的位置: 首页 > 综合 > 正文

Android 修改Navigation bar为半透明?

2014年08月29日 ⁄ 综合 ⁄ 共 2196字 ⁄ 字号 评论关闭

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         CSDNhttp://www.csdn.net
         雨季o莫忧离:http://blog.csdn.net/luckkof

正文

 

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

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;

    }

    . . .

对于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

…

}

注意:
修改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不生效,后续也不做更多支持。

抱歉!评论已关闭.