首页 > 技术文章 > Android 8.0 NavigationBar 颜色问题。

xiapeng0701 2018-02-22 18:19 原文

1.

packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java

 

    public void onNavigationVisibilityChanged(int vis, int mask, boolean nbModeChanged,
            int navigationBarMode) {
        int oldVis = mSystemUiVisibility;
        int newVis = (oldVis & ~mask) | (vis & mask);
        int diffVis = newVis ^ oldVis;
        if ((diffVis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0
                || nbModeChanged) {
            boolean last = mNavigationLight;
            mHasLightNavigationBar = isLight(vis, navigationBarMode,
                    View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
            mNavigationLight = mHasLightNavigationBar
                    && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim)
                    && !mQsCustomizing;
            if (mNavigationLight != last) {
                updateNavigation();
            }
        }
        mSystemUiVisibility = newVis;
        mLastNavigationBarMode = navigationBarMode;
    }

其中决定了背景色是否为亮色或者为暗色,通过此处的设置系统回去自动的决定icon的颜色。

 bug原因:

 a. app 设置了View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR 属性,导致系统把背景色的标志为了亮色,但此处的设置并不本质决定背景色。由于标志为了亮色所以图标icon为黑色。

 b. 没有实际修改背景色,还是使用的是系统主题里面的颜色,黑色。

所以看不到图表了,本身是app的问题呢。

2.在不修改app 的前提下的修改测试方法。

  a.为单独的app重新设置一遍。

         int oldVis = mSystemUiVisibility;
         int newVis = (oldVis & ~mask) | (vis & mask);
         int diffVis = newVis ^ oldVis;
+        boolean isBlack = false;
         if ((diffVis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0
                 || nbModeChanged) {
             boolean last = mNavigationLight;
             mHasLightNavigationBar = isLight(vis, navigationBarMode,
                     View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
+            String packageName = "xxxx";
+            String className = "xxxxxxxxxx";
+            ActivityManager activityManager = (ActivityManager) mContext.getSystemService(mContext.ACTIVITY_SERVICE); 
+            List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
+            if (tasksInfo.size() > 0) {  
+                ComponentName topConponent = tasksInfo.get(0).topActivity;
+                if (packageName.equals(topConponent.getPackageName()) && className.equals(topConponent.getClassName())) {  
+                    isBlack = true;
+                }
+            }
             mNavigationLight = mHasLightNavigationBar
                     && (mScrimAlphaBelowThreshold || !mInvertLightNavBarWithScrim)
-                    && !mQsCustomizing;
+                    && !mQsCustomizing 
+                    && !isBlack;
             if (mNavigationLight != last) {
                 updateNavigation();
             }

 

推荐阅读