Android 13 SystemUI,底部導(dǎo)航欄新增功能按鍵、導(dǎo)航欄側(cè)邊(左側(cè),右側(cè),頂側(cè))顯示。
寫在前面: SystemUI 是Android原生系統(tǒng)極重要的系統(tǒng)APP,本文介紹如何根據(jù)需要在原生三個(gè)按鍵BACK HOME RECENT的基礎(chǔ)上,新增新的自定義按鍵。SystemUI總共分為三個(gè)版本:Phone手機(jī)、Tablet平板、TV版本。Android13中,Phone、Tablet是一樣的。本教程適用SystemUI版本:Android13——>Phone 、Tablet版SystemUI。 注:SystemUI的啟動(dòng)流程,本篇文章不介紹。
一、底部導(dǎo)航欄新增功能按鍵。
??首先介紹一下Phone、Tablet版的SystemUI的啟動(dòng)路線,看下圖: ??啟動(dòng)流程中的CentralSurfaces,是我們修改的切入點(diǎn)。打開源碼找到CentralSurfacesImpl.java文件,下面我沿著CentralSurfacesImpl.java簡(jiǎn)單描述一下修改思路,然后貼出完整補(bǔ)丁。
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);//從這里進(jìn)去創(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) {
. . . . . .
. . . . . .
. . . . . .
//從這里分為兩個(gè)部分
NavigationBar navBar = component.getNavigationBar();//導(dǎo)航欄實(shí)例化
navBar.init();//將導(dǎo)航欄添加到屏幕上
. . . . . .
. . . . . .
. . . . . .
}
注:導(dǎo)航欄實(shí)例化會(huì)去加載導(dǎo)航欄對(duì)應(yīng)的XML,里面默認(rèn)只有Back|Home|Recent,想要添加新的功能鍵,第一步就是去修改這個(gè)XML;navBar.init()中則是為按鍵添加圖標(biāo)、綁定點(diǎn)擊事件,并最終通過windowManager的addView方法將導(dǎo)航添加到桌面上顯示。
完整補(bǔ)?。?/p>
1、xml中新增按鈕
??以我的項(xiàng)目分辨率 = 1920x1080、dpi = 320、density = 2來說,對(duì)應(yīng)修改的xml為——>res\values-sw372dp\config.xml 我這里給出的例子,除了原生Back|Home|Recent之外,新增了其它四個(gè)按鍵。
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選項(xiàng)、createView函數(shù)新增對(duì)新按鈕描述String的過濾;這個(gè)類的功能主要是從上述的xml文件中把所有按鍵加載進(jìn)來,并進(jìn)行過濾操作。
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ò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。