Android 13 SystemUI,底部导航栏新增功能按键、导航栏侧边(左侧,右侧,顶侧)显示。

写在前面: SystemUI 是Android原生系统极重要的系统APP,本文介绍如何根据需要在原生三个按键BACK HOME RECENT的基础上,新增新的自定义按键。SystemUI总共分为三个版本:Phone手机、Tablet平板、TV版本。Android13中,Phone、Tablet是一样的。本教程适用SystemUI版本:Android13——>Phone 、Tablet版SystemUI。
注:SystemUI的启动流程,本篇文章不介绍。
在这里插入图片描述

一、底部导航栏新增功能按键。

  首先介绍一下Phone、Tablet版的SystemUI的启动路线,看下图:
在这里插入图片描述
  启动流程中的CentralSurfaces,是我们修改的切入点。打开源码找到CentralSurfacesImpl.java文件,下面我沿着CentralSurfacesImpl.java简单描述一下修改思路,然后贴出完整补丁。

1、frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\CentralSurfacesImpl.java
    @Override
    public void start() {
   
    	. . . . . .
    	. . . . . .
    	. . . . . .
    	createAndAddWindows(result);//这里为入口
    	. . . . . .
    	. . . . . .
    	. . . . . .
	}

    @Override
    public void createAndAddWindows(@Nullable RegisterStatusBarResult result) {
   
        makeStatusBarView(result);//从这里进去创建状态栏、导航栏
        mNotificationShadeWindowController.attach();
        mStatusBarWindowController.attach();
    }

    // ================================================================================
    // Constructing the view
    // ================================================================================
    protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
   
    	. . . . . .
    	. . . . . .
    	. . . . . .
    	createNavigationBar(result);//创建导航栏入口
    	. . . . . .
    	. . . . . .
    	. . . . . .

	}

    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
   
        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);
    }

2、frameworks\base\packages\SystemUI\src\com\android\systemui\navigationbar\NavigationBarController.java

    public void createNavigationBars(final boolean includeDefaultDisplay,
            RegisterStatusBarResult result) {
   
        updateAccessibilityButtonModeIfNeeded();

        // Don't need to create nav bar on the default display if we initialize TaskBar.
        final boolean shouldCreateDefaultNavbar = includeDefaultDisplay
                && !initializeTaskbarIfNecessary();
        Display[] displays = mDisplayManager.getDisplays();
        for (Display display : displays) {
   
            if (shouldCreateDefaultNavbar || display.getDisplayId() != DEFAULT_DISPLAY) {
   
                createNavigationBar(display, null /* savedState */, result);
            }
        }
    }

    /**
     * Adds a navigation bar on default display or an external display if the display supports
     * system decorations.
     *
     * @param display the display to add navigation bar on.
     */
    @VisibleForTesting
    void createNavigationBar(Display display, Bundle savedState, RegisterStatusBarResult result) {
   
        . . . . . .
    	. . . . . .
    	. . . . . .
    	//从这里分为两个部分
    	NavigationBar navBar = component.getNavigationBar();//导航栏实例化
        navBar.init();//将导航栏添加到屏幕上
        . . . . . .
    	. . . . . .
    	. . . . . .
    }

注:导航栏实例化会去加载导航栏对应的XML,里面默认只有Back|Home|Recent,想要添加新的功能键,第一步就是去修改这个XML;navBar.init()中则是为按键添加图标、绑定点击事件,并最终通过windowManager的addView方法将导航添加到桌面上显示。

完整补丁:

1、xml中新增按钮

  以我的项目分辨率 = 1920x1080、dpi = 320、density = 2来说,对应修改的xml为——>res\values-sw372dp\config.xml 我这里给出的例子,除了原生Back|Home|Recent之外,新增了其它四个按键。

diff --git a/frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml b/frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml
index 07b797a324..3b936766c5 100644
--- a/frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml
+++ b/frameworks/base/packages/SystemUI/res/values-sw372dp/config.xml
@@ -21,5 +21,5 @@
      for different hardware and product builds. -->
 <resources>
     <!-- Nav bar button default ordering/layout -->
-    <string name="config_navBarLayout" translatable="false">left[.25W],back[.5WC];home;recent[.5WC],right[.25W]</string>
+    <string name="config_navBarLayout" translatable="false">back;home;recent;volume;comments;whiteboard;collapse</string>
 </resources>

2、NavigationBarInflaterView.java

  inflateLayout函数新增inflateButtons选项、createView函数新增对新按钮描述String的过滤;这个类的功能主要是从上述的xml文件中把所有按键加载进来,并进行过滤操作。

diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
index 59bb2278ed..5724e09a00 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
@@ -60,6 +60,12 @@ public class NavigationBarInflaterView extends FrameLayout
     public static final String BACK = "back";
     public static final String HOME = "home";
     public static final String RECENT = "recent";
+    //xuhao add
+    public static final String VOLUME = "volume";
+    public static final String COMMENTS = "comments";
+    public static final String WHITEBOARD = "whiteboard";
+    public static final String COLLAPSE = "collapse";
+	//
     public static final String NAVSPACE = "space";
     public static final String CLIPBOARD = "clipboard";
     public static final String HOME_HANDLE = "home_handle";
@@ -96,7 +102,7 @@ public class NavigationBarInflaterView extends FrameLayout
     private View mLastPortrait;
     private View mLastLandscape;
 
-    private boolean mIsVertical;
+    private boolean mIsVertical ;
     private boolean mAlternativeOrder;
 
     private OverviewProxyService mOverviewProxyService;
@@ -177,6 +183,7 @@ public class NavigationBarInflaterView extends FrameLayout
     void updateButtonDispatchersCurrentView() {
   
         if (mButtonDispatchers != null) {
   
             View view = mIsVertical ? mVertical : mHorizontal;
+            Log.d(TAG,"mIsVertical"+mIsVertical);
             for (int i = 0; i < mButtonDispatchers.size(); i++) {
   
                 final ButtonDispatcher dispatcher = mButtonDispatchers.valueAt(i);
                 dispatcher.setCurrentView(view);
@@ -236,34 +243,64 @@ public class NavigationBarInflaterView extends FrameLayout
         if (newLayout == null) {
   
             newLayout = getDefaultLayout();
         }
-        String[] sets = newLayout.split(GRAVITY_SEPARATOR, 3);
-        if (sets.length != 3) {
   
+
+        //xuhao add 
+        String[] sets = newLayout.split(GRAVITY_SEPARATOR, 7);
+        if (sets.length != 7) {
   
             Log.d(TAG, "Invalid layout.");
             newLayout = getDefaultLayout();
-            sets = newLayout.split(GRAVITY_SEPARATOR, 3);
+            sets = newLayout.split(GRAVITY_SEPARATOR, 7);
         
  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Android 系统中,配置导航栏上滑显示需要对系统 UI 进行相应的设置和操作。一般来说,这个过程需要遵循以下几个步骤: 1. 打开 Android 系统设置,并找到“系统 UI tuner”选项。 2. 进入“System UI Tuner”页面,选择“Navigation bar”选项。 3. 在“Navigation bar”页面,勾选“Swipe up on home button”选项。 4. 接下来,用户可以根据自己的需要选择相应的设置项。比如,可以选择当用户在主屏幕滑动或者点击主屏幕按钮时,导航栏是否应该显示。还可以设置是否需要快速启动 Google 助手或其他应用。另外,还可以设置不同手势触发不同导航栏功能或者更改导航栏的界面样式等。 5. 最后,如果您想要禁用这个特性,只需要在“Navigation bar”页面取消勾选“Swipe up on home button”选项即可。 需要注意的是,以上步骤仅适用于当前运行的 Android 版本中存在“System UI Tuner”选项的设备。此外,一些 Android 设备可能会拥有各自不同的配置选项和界面,所以在实际操作时,最好先了解自己的设备型号和 Android 版本,并参考相应的用户手册或者官方文档。 ### 回答2: Android系统UI配置导航栏上滑显示,主要是通过系统的设置菜单来实现。在大多数的Android设备中,该功能都是默认开启的,但是在某些旧型号的设备上,可能需要手动开启才能使用。 为了开始配置导航栏上滑显示,首先需要进入系统的设置菜单。具体进入方式可能会因设备型号而异,但通常可以通过从主屏幕或应用程序菜单中选择“设置”来进入。 打开设置菜单后,需要找到“显示”或“屏幕”选项。然后,可以在下拉菜单中找到“导航栏”选项,点击进入。 在导航栏设置中,可以看到“导航栏上滑显示”选项。默认情况下,该选项应该是开启状态,但如果不是,可以通过开关按钮来手动开启。 在开启导航栏上滑显示功能后,可以测试它是否正常工作。要测试它,只需要在应用程序或主屏幕中向上滑动,应该会出现导航栏。如果导航栏未出现,可能需要重新启动设备或检查是否有其他应用程序干扰导航栏显示。 需要注意的是,导航栏上滑显示功能Android系统中的不同版本中可能有所不同。在一些最新的系统版本中,导航栏上滑显示可能已被替换为新的手势导航功能。因此,在进行上述设置时,需要查看设备所运行的Android系统版本,并根据版本进行相应的设置。 ### 回答3: Android 系统 UI 配置导航栏上滑显示是指在 Android 手机或平板设备中,将导航栏的隐藏与显示控制与手势上滑事件进行了关联,使得用户在上滑操作时能够显示或者隐藏底部的导航栏。 在 Android 操作系统中,导航栏通常位于设备底部,用于进行返回、主屏幕、多任务查看等基本操作。原本,导航栏不会自动隐藏,只有在使用全屏模式时才会自动隐藏,但是在 Android 操作系统 4.4(KitKat)版本中,Google 引入了一项新特性,允许用户启用手势上滑操作,使得导航栏能够随着手势上滑自动隐藏,并在需要时进行显示。 要在 Android 设备上启用这个选项,可以通过以下步骤进行配置: 1. 首先,确保您的 Android 设备运行的是 4.4 版本及以上的系统版本。 2. 进入系统设置界面,找到“显示”选项。 3. 在显示选项中,找到“导航栏”选项,点击进入该设置页面。 4. 在导航栏设置页面中,找到“全屏手势”选项,并将其打开。 5. 启用全屏手势之后,您就可以进行手势上滑来显示或隐藏底部的导航栏了。 需要注意的是,启用全屏手势选项后,手势上滑操作就会与设备的“向上滑动以解锁”功能进行了关联,因此您需要在滑动操作后进行解锁才能进入系统界面。 总的来说,Android 系统 UI 配置导航栏上滑显示是一项非常实用的功能,可以提高用户的操作体验、提高屏幕使用率,并适用于绝大多数的 Android 手机和平板设备。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苏苏码不动了

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值