Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar

 场景分析,

为了完全实现沉浸式效果,在进入特定的app后可以将导航栏移除,当退出app后再次将导航栏恢复。(下面将采用发送广播的方式来移除和恢复导航栏)

ps:不修改源码的情况下,简单的沉浸式效果实现代码如下,在ACitivy中添加即可(此种做法的缺点是当界面弹出对话框时或者点击的屏幕的顶部或底部边缘,会再次出现导航栏和状态栏)

@Override public void onWindowFocusChanged(boolean hasFocus) {//new add     super.onWindowFocusChanged(hasFocus);      if (hasFocus && Build.VERSION.SDK_INT >= 19) {         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 //hide title&navigation                 View.SYSTEM_UI_FLAG_FULLSCREEN                         |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY                         |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);     } }

一、屏蔽导航栏虚拟按键(Home和RecentAPP)

我们先来分析下底部导航栏所处的控件,
所见即所得,既然是虚拟按键,必定有相对应的View,要么是xml的布局文件,要么是自定义View,基于此思路,打开AS中的Tools菜单下Android-->Android Device Monitor-->Hierarchy View ,不会用的童鞋可以自己参考这篇

我们发现Home按键对应的id为 @+id/home, 有了id我们就已经成功的揪出它了,接下来通过搜索命令

grep -nr 命令

通过搜索,我们发现了Home按键的 源码位置

frameworks\base\packages\SystemUI\res\layout-sw600dp\navigation_bar.xml
frameworks\base\packages\SystemUI\res\layout\navigation_bar.xml

     <!--2018-10-13 cczheng set home KeyButton  visibility  invisible-->         <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"             android:layout_width="162dp" android:paddingStart="42dp" android:paddingEnd="42dp"             android:layout_height="match_parent"             android:src="@drawable/ic_sysbar_home"             android:scaleType="centerInside"             systemui:keyCode="3"             systemui:keyRepeat="true"             android:layout_weight="0"             android:contentDescription="@string/accessibility_home"             android:visibility="invisible"             />       <!--2018-10-13 cczheng set recent KeyButton  visibility  invisible-->         <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"             android:layout_width="162dp" android:paddingStart="42dp" android:paddingEnd="42dp"             android:layout_height="match_parent"             android:src="@drawable/ic_sysbar_recent"             android:scaleType="centerInside"             android:layout_weight="0"             android:contentDescription="@string/accessibility_recent"             android:visibility="invisible"             />

此处说下为什么用invisible,而不用gone, 如果使用gone,剩下的按键将自动居中,这并不是我们想要的效果,当你以为按照上面的代码屏蔽后就可以安心的交差了,那你真是too young too simple了。

继续搜索 R.id.home,我们接下来查找在java代码中的引用,找到位置

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

public View getBackButton() {     ImageView view = (ImageView) mCurrentView.findViewById(R.id.back);     view.setImageDrawable(mNavBarPlugin.getBackImage(view.getDrawable()));     return view; }

很明显通过getBackButton()方法能获取到该View,就能对View进行操作,继续查看

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信