Android之framework修改底部导航栏NavigationBar动态显示和隐藏

大家都知道,Android从3.0版本开始就加入了NavigationBar,主要是为那些没有实体按键的设备提供虚拟按键,但是,它始终固定在底部,占用48dp的像素高度,尽管从android 4.4开始可以全透明,使用这一部分像素,但三个按钮始终悬浮在屏幕上,这对于有强迫症的朋友来说是无法忍受的。因此,本文的目的就是修改framework部分代码,可以动态隐藏和显示NavigationBar,同时又尽量不影响系统的正常。

主要思路:

在NavigationBar的布局左部加入一个Button(在SystemUI模块实现),点击隐藏NavigationBar,即将NavigationBar从WindowManager中移除掉。需要的时候,通过一个从屏幕底部向上的滑动手势(在policy模块实现)调出NavigationBar。如下两图对比所示:一张为移除前,另一张为移除后。

具体实现:

①.增加按钮实现动态隐藏,主要修改在frameworks/base/packages/SystemUI模块,首先我们增加一个按钮,主要修改

frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml文件,图片资源和字符串我就不提了,具体如下:

diff –git a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xmlindex 16027d9..326aafc 100644— a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml+++ b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml@@ -42,12 +42,28 @@><!– navigation controls –>+<!–BEGIN liweiping<Viewandroid:layout_width="40dp"android:layout_height="match_parent"android:layout_weight="0"android:visibility="invisible"/>+–>+<FrameLayout+android:layout_width="@dimen/navigation_extra_key_width"+android:layout_height="match_parent"+android:layout_weight="0" >+<ImageButton+android:id="@+id/hide_bar_btn"+android:layout_width="@dimen/navigation_extra_key_width"+android:layout_height="match_parent"+android:contentDescription="@string/accessibility_hide"+android:src="@drawable/ic_sysbar_hide"+/>++</FrameLayout>+<!–END liweiping –><com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"android:layout_width="@dimen/navigation_key_width"android:layout_height="match_parent"@@ -246,12 +262,28 @@android:layout_weight="0"android:contentDescription="@string/accessibility_back"/>+<!–BEGIN liweiping<Viewandroid:layout_height="40dp"android:layout_width="match_parent"android:layout_weight="0"android:visibility="invisible"/>+–>+<FrameLayout+android:layout_weight="0"+android:layout_width="match_parent"+android:layout_height="40dp" >++<ImageButton+android:id="@+id/hide_bar_btn"+android:layout_width="match_parent"+android:layout_height="40dp"+android:contentDescription="@string/accessibility_hide"+android:src="@drawable/ic_sysbar_hide_land"+/>+</FrameLayout>+<!–END liweiping –></LinearLayout><!– lights out layout to match exactly –>接下来修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java,为按钮提供一个接口,具体如下:diff –git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.javaindex 88e71e2..7545984 100644— a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java@@ -45,6 +45,7 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.DelegateViewHelper; import com.android.systemui.statusbar.policy.DeadZone;+import com.android.systemui.statusbar.policy.KeyButtonRipple; import com.android.systemui.statusbar.policy.KeyButtonView; import java.io.FileDescriptor;@@ -265,6 +266,13 @@ public class NavigationBarView extends LinearLayout {public View getImeSwitchButton() {return mCurrentView.findViewById(R.id.ime_switcher);}+ //BEGIN liweiping+ public View getHideBarButton() {+View view = mCurrentView.findViewById(R.id.hide_bar_btn);+view.setBackground(new KeyButtonRipple(getContext(), view));+return view;+ }+ //END liweipingprivate void getIcons(Resources res) {mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);@@ -412,7 +420,6 @@ public class NavigationBarView extends LinearLayout {mCurrentView = mRotatedViews[Surface.ROTATION_0];getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener);-updateRTLOrder();}最后便是在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java实现点击事件了:+ private final OnClickListener mHideBarClickListener = new OnClickListener() {+@Override+public void onClick(View view) {+Log.i("way", "mHideBarClickListener onClick…");+removeNavigationBar();+}+ };+ private void removeNavigationBar() {+if (DEBUG) Log.d(TAG, "removeNavigationBar: about to remove " + mNavigationBarView);+if (mNavigationBarView == null) return;++mWindowManager.removeView(mNavigationBarView);+mNavigationBarView = null;+ }到此,隐藏NavigationBar告一段落了。

生命中,每一种苦难的背后都有一片晴朗的天空

Android之framework修改底部导航栏NavigationBar动态显示和隐藏

相关文章:

你感兴趣的文章:

标签云: