1. 程式人生 > >Android 5.1修改SystemUi導航欄背景顏色

Android 5.1修改SystemUi導航欄背景顏色

現在很多手機都是用虛擬按鍵了,但是很多手機的虛擬按鍵的導航欄背景顏色是黑色的,看起來其醜無比啊,比如華為;
要想看上去協調一些,當然是改成透明的啦,怎麼改呢?按照以往的思路,當然是直接改佈局檔案就可以了的,想想這個思路也沒錯,佈局檔案位於
frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml

android:background=”@drawable/system_bar_background”

看上去就是改這個背景就可以了,通過grep和find之後找到了這個顏色,它不是一個drawable檔案而是一個顏色值:位於frameworks/base/packages/SystemUI/res/values/colors.xml

<drawable name="system_bar_background">@color/system_bar_background_opaque</drawable>

但素,我改了之後,發現這樣是行不通的,不管是改成白色,還是透明色,導航條的背景是萬年不變的黑色,改了好幾次都沒有效果,於是我開始懷疑我的智商。。。。
當然最終的解決辦法不是這條路了,這條路顯然是不通的,怎麼辦,看原始碼,看看導航欄是怎麼構造的,怎麼新增背景的;
GO!!!

1.看建構函式:

public NavigationBarView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mDisplay = ((WindowManager)context.getSystemService(
                Context.WINDOW_SERVICE)).getDefaultDisplay();

        final Resources res = getContext().getResources();
        mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size);
        mVertical = false;
        mShowMenu = false;
        mDelegateHelper = new DelegateViewHelper(this);
        mTaskSwitchHelper = new NavigationBarViewTaskSwitchHelper(context);

        getIcons(res);

        mBarTransitions = new NavigationBarTransitions(this);
    }

2.前面一大段和背景顏色沒有半毛錢關係,因此寄希望於最後一局,我們看到在最後一行構造NavigationBarTransitions的時候導航欄把自己傳了過去。我們點進去看看,該檔案位於:

public NavigationBarTransitions(NavigationBarView view) {
        super(view, R.drawable.nav_background);
        mView = view;
        mBarService = IStatusBarService.Stub.asInterface(
                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
    }

嗯,呼叫了父類的構造方法,並且穿了一個背景顏色過去,看上去就是這裡了,我們看下父類構造方法,父類位於frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
我們來看下建構函式:

public BarTransitions(View view, int gradientResourceId) {
        mTag = "BarTransitions." + view.getClass().getSimpleName();
        mView = view;
        mBarBackground = new BarBackgroundDrawable(mView.getContext(), gradientResourceId);
        if (HIGH_END) {
           mView.setBackground(mBarBackground);
        }
    }

沒錯,這裡把顏色改變了,也就是說不管佈局檔案裡面怎麼改變背景顏色,最後的顏色都會在這裡被重新設定。所以要實現半透明,要麼就是去掉這行設定程式碼:

mView.setBackground(mBarBackground);

要麼就是把這行程式碼設定的顏色改成我們需要的透明色,我不太喜歡改程式碼,所以就註釋掉了。然後把佈局的背景顏色改成白色試了一下,嗯,有效果,不錯不錯;
現在已經可以修改了,證明思路不錯,具體效果如何呢?我試了下,這麼改沒辦法像狀態列一樣動態改變透明度,所以有時候看起來很醜。那應該怎麼改才能和狀態列一致呢?