Android 13 SystemUI,底部導(dǎo)航欄新增功能按鍵、導(dǎo)航欄側(cè)邊(左側(cè),右側(cè),頂側(cè))顯示。
寫在前面: SystemUI 是Android原生系統(tǒng)極重要的系統(tǒng)APP,本文介紹如何根據(jù)需要在原生三個按鍵BACK HOME RECENT的基礎(chǔ)上,新增新的自定義按鍵。SystemUI總共分為三個版本:Phone手機、Tablet平板、TV版本。Android13中,Phone、Tablet是一樣的。本教程適用SystemUI版本:Android13——>Phone 、Tablet版SystemUI。 注:SystemUI的啟動流程,本篇文章不介紹。
一、底部導(dǎo)航欄新增功能按鍵。
??首先介紹一下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);//從這里進去創(chuàng)建狀態(tài)欄、導(dǎo)航欄
mNotificationShadeWindowController.attach();
mStatusBarWindowController.attach();
}
// ================================================================================
// Constructing the view
// ================================================================================
protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) {
. . . . . .
. . . . . .
. . . . . .
createNavigationBar(result);//創(chuàng)建導(dǎo)航欄入口
. . . . . .
. . . . . .
. . . . . .
}
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();//導(dǎo)航欄實例化
navBar.init();//將導(dǎo)航欄添加到屏幕上
. . . . . .
. . . . . .
. . . . . .
}
注:導(dǎo)航欄實例化會去加載導(dǎo)航欄對應(yīng)的XML,里面默認只有Back|Home|Recent,想要添加新的功能鍵,第一步就是去修改這個XML;navBar.init()中則是為按鍵添加圖標、綁定點擊事件,并最終通過windowManager的addView方法將導(dǎo)航添加到桌面上顯示。
完整補丁:
1、xml中新增按鈕
??以我的項目分辨率 = 1920x1080、dpi = 320、density = 2來說,對應(yīng)修改的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. -->
-
+
2、NavigationBarInflaterView.java
??inflateLayout函數(shù)新增inflateButtons選項、createView函數(shù)新增對新按鈕描述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 =
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。