完美去掉大黑条!!Android 5.1修改导航栏背景颜色

现在很多手机都是用虚拟按键了,但是很多手机的虚拟按键的导航栏背景颜色是黑色的,看起来其丑无比啊,比如华为;

要想看上去协调一些,当然是改成透明的啦,怎么改呢?按照以往的思路,当然是直接改布局文件就可以了的,想想这个思路也没错,布局文件位于
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);

要么就是把这行代码设置的颜色改成我们需要的透明色,我不太喜欢改代码,所以就注释掉了。然后把布局的背景颜色改成白色试了一下,嗯,有效果,不错不错;

现在已经可以修改了,证明思路不错,具体效果如何呢?我试了下,这么改没办法像状态栏一样动态改变透明度,所以有时候看起来很丑。那应该怎么改才能和状态栏一致呢?

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯人院的院长大人

给点实际性的支持不?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值