Android齊劉海適配完全攻略

齊劉海.jpeg
背景
Apple 一直在引領設計的潮流,自從 iPhone X 釋出之後,"劉海屏" 就一直存在爭議。但使用者體驗的提升,越來越多的Android廠家逐漸開始在自家旗艦機上使用劉海屏,尤其是 Android P 釋出之後,也從系統級支援凹槽螢幕設計。
目前在國內比較常見的就是 OPPO x21 和 華為 P20。對於劉海屏,在享受其帶來的視覺體驗上的同事,我們也要對自家APP做相應的適配,才能最大化的利用劉海屏。
- 在Android8.0,Google官方並未提供劉海屏的相關API,因此,對於8.0的系統,各廠家會對劉海屏做特殊適配
- 在Android9.0,Google官方提供了DisplayCutout來支援劉海屏適配
哪些頁面需要單獨適配
就算是增加了劉海屏,你也可以發現,大部分都是“切割”的狀態列的區域,所以就面臨了三種情況。
- 有狀態列的頁面,不會收到劉海屏的影響。
- 全屏未適配劉海屏的頁面,系統會對劉海屏區域進行切割,讓整體 UI 頁面做下移處理,避開劉海屏的顯示。
- 全屏已適配劉海屏的頁面,可以相容劉海屏,做到真正的全屏顯示。
因此,目前我們需要做適配的頁面只有 全屏無狀態列 的頁面進行適配即可
技術適配劉海屏
概念說明
為了方便討論,此處引用小米官方文件引用的概念:

1、基於Google提供的API進行適配
在全屏模式下,我們需要有辦法獲取到劉海屏凹槽的高度,才可以做到設計和佈局的時候,留出安全距離。
雖然 Google 要求,劉海屏的凹槽,必須和劉海的高度保持一致,而劉海屏又被隱藏在狀態列了,所以有一個思路是直接獲取狀態列的高度,來判斷劉海之外,可佈局的安全區域。
不過 Android P 已經預留出了標準的測量 劉海屏凹槽 的API: DisplayCutout
此方案僅支援Android9.0以上(API>28)
允許Window擴充套件到劉海區域
Google官方支援三種劉海屏支援模式:
- 預設模式(LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT)
- 劉海區繪製模式( LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES)
- 劉海區不繪製模式(LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER)
如果開發者未作任何宣告,則會按預設模式處理。以下將具體介紹這三種模式的表現。
預設模式- (LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT)
為了在不影響操作的情況下,儘可能利用劉海屏的顯示區域,有以下表現:
非全屏(normal mode) | 全屏(fullscreen mode) | |
---|---|---|
豎屏(portrait mode) | 使用耳朵區 | 禁用耳朵區 |
橫屏(landscape mode) | 禁用耳朵區 | 禁用耳朵區 |
注:所謂全屏(fullscreen mode),指隱藏狀態列(status bar),即通過 SYSTEM_UI_FLAG_FULLSCREEN 實現的效果。
**劉海區繪製模式 ** - ( LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES)
如上所述,預設模式下某些場景會禁用耳朵區,那是因為這些場景下,系統無法判斷開發者是否會把控制元件放置在耳朵區,所以只好預設禁用。如果開發者想要在那些場景下使用耳朵區,需要主動宣告,即使用 LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 來主動宣告。
劉海區不繪製模式- (LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER )
開發者選用這個模式後,意味著不繪製內容到耳朵區。如非必需,我們不建議採用這種模式,因為那樣會浪費不少螢幕空間,使用者體驗不佳。
當開發者選用 NEVER 模式時, ofollow,noindex">DisplayCutout 物件 的方法都會返回空值,因為 Google 認為既然開發者不使用耳朵區,就不需要關心劉海的大小了。
設定劉海區繪製模式:
-
可以使用硬編碼的方式設定是否允許window擴充套件到劉海區的程式碼
if (Build.VERSION.SDK_INT >= 28) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; getWindow().setAttributes(lp); }
-
也可以通過主題設定
<style name="ActivityTheme"> <item name="android:windowLayoutInDisplayCutoutMode"> shortEdges <!-- default, shortEdges, never --> </item> </style>
注意:Android可能不允許內容檢視與狀態列重疊,因此,需要使用 View.setSystemUiVisibility(int) 來設定一下屬性:
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //全屏
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //隱藏導航欄
- SYSTEM_UI_FLAG_LAYOUT_STABLE //不變
通過程式碼規避重要內容
view.postDelayed(new Runnable() { @Override public void run() { DisplayCutout displayCutout = view.getRootWindowInsets().getDisplayCutout(); Log.i("AskSky", "SafeInsetBottom:" + displayCutout.getSafeInsetBottom()); Log.i("AskSky", "SafeInsetLeft:" + displayCutout.getSafeInsetLeft()); Log.i("AskSky", "SafeInsetRight:" + displayCutout.getSafeInsetRight()); Log.i("AskSky", "SafeInsetTop:" + displayCutout.getSafeInsetTop()); } }, 100);
使用官方API,可以獲取到凹槽的上下左右的距離,這樣就可以根據返回的尺寸,合理規劃佈局,規避無法顯示的區域。
獲取狀態列高度方法
由於 Notch 裝置的狀態列高度與正常機器不一樣,因此在需要使用狀態列高度時,不建議寫死一個值,而應該改為讀取系統的值。
以下是獲取當前裝置狀態列高度的方法:
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); }
其他注意事項
-
不要讓剪下區域遮擋重要的文字,控制元件或其他資訊。
-
不要將需要精細觸控識別的互動式元素放置或擴充套件到剪下區域。 切口區域的觸控靈敏度可能較低。
-
避免使用硬編碼獲取狀態列高度,因為這有可能導致內容重疊或裁切。儘量使用 WindowInsetsCompat 來檢索狀態列高度並進行內容填充
-
應用程式可能不會充滿整個螢幕,應儘量使用 View.getLocationInWindow() 來代替 View.getLocationOnScreen() 。
-
正確使用進出全屏模式的過渡,具體請 檢視此文件
-
在縱向模式下使用預設剪下行為時,如果剪下區域位於頂部邊緣且視窗未設定 FLAG_FULLSCREEN 或 View.SYSTEM_UI_FLAG_FULLSCREEN ,則視窗可以延伸到剪下區域。 同樣,如果剪下區域位於底部邊緣且視窗未設定 View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ,則視窗可以延伸到剪下區域。在全屏或橫向模式中,窗口布局不與切口區域重疊。
-
如果您的應用需要轉換為全屏模式,請使用
shortEdges
或never
裁切模式。 因為預設剪下行為可能會導致應用中的內容在轉換期間上下移動,如下圖所示:

預設裁切模式可能導致內容上下移動
- 在全屏模式下,使用視窗與螢幕座標應該注意,因為應用程式顯示通知欄時,不會佔用整個螢幕,因為有通知欄,此時螢幕原點座標與視窗原點座標不再相同,此時可以使用 getLocationOnScreen() 方法獲取當前螢幕座標,然後再根據需要轉換為視窗座標。下圖顯示了有通知欄時內容視窗與通知欄原點座標的不同之處:

顯示狀態列時原點座標的差異
同理,在處理 MotionEvent
事件時,儘量使用 MotionEvent.getX() 和 MotionEvent.getY() 來避免座標的問題,不要使用 MotionEvent.getRawX() 或 MotionEvent.getRawY()
測試結果
如果沒有劉海屏裝置,可以使用Google提供的模擬器,在開發者選項中開啟支援 模擬具有凹口的顯示屏(Simulate a display with a cutout)

模擬劉海屏
2、基於不同廠商的劉海屏適配方案
小米全面屏適配方案 - 官方文件
1、判斷是否全面屏
系統增加了 property ro.miui.notch,值為1時則是 Notch 屏手機。
SystemProperties.getInt("ro.miui.notch", 0) == 1;
2、 應用頁面設定使用劉海區顯示
使用新增的Meta-data屬性notch.config,在應用的AndroidManifest.xml中增加meta-data屬性,此屬性不僅可以針對Application生效,也可以對Activity配置生效
- 對Application生效,意味著該應用的所有頁面,系統都不會做豎屏場景的特殊下移或者是橫屏場景的右移特殊處理:
<meta-data android:name="notch.config" android:value="portrait|landscape"/>
其中,value 的取值可以是以下4種:
"none" 橫豎屏都不繪製耳朵區 "portrait" 豎屏繪製到耳朵區 "landscape" 橫屏繪製到耳朵區 "portrait|landscape" 橫豎屏都繪製到耳朵區
注:一旦開發者聲明瞭meta-data,系統就會優先遵從開發者的宣告。
- 對Activity生效,如果開發者希望對特定 Window 作處理,可以使用該介面。 在 WindowManager.LayoutParams 增加 extraFlags 成員變數,用以宣告該 window 是否使用耳朵區。
其中,extraFlags 有以下變數:
0x00000100 開啟配置 0x00000200 豎屏配置 0x00000400 橫屏配置
組合後表示 Window 的配置,如:
0x00000100 | 0x00000200 豎屏繪製到耳朵區 0x00000100 | 0x00000400 橫屏繪製到耳朵區 0x00000100 | 0x00000200 | 0x00000400 橫豎屏都繪製到耳朵區
控制 extraFlags 時注意只控制這幾位,不要影響其他位。可以用 Window 的 addExtraFlags 和 clearExtraFlags 來修改, 這兩個方法是 MIUI 增加的方法,需要反射呼叫。
int flag = 0x00000100 | 0x00000200 | 0x00000400; try { Method method = Window.class.getMethod("addExtraFlags", int.class); method.invoke(getWindow(), flag); } catch (Exception e) { Log.i(TAG, "addExtraFlags not found."); }
3、獲取挖孔區域寬高
獲取當前裝置劉海高度的方法:
int resourceId = context.getResources().getIdentifier("notch_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); }

Notch高度示意.png
獲取當前裝置劉海寬度的方法:
int resourceId = context.getResources().getIdentifier("notch_width", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); }

Notch寬度示意.png
4、“隱藏螢幕劉海”適配
MIUI 針對 Notch 裝置,有一個“隱藏螢幕劉海”的設定項(設定-全面屏-隱藏螢幕劉海),具體表現是:系統會強制蓋黑狀態列(無視應用的Notch使用宣告),視覺上達到隱藏劉海的效果。但會給某些應用帶來適配問題(控制元件/內容遮擋或過於靠邊等)。
因此開發者在適配時,還需要檢查開啟“隱藏螢幕劉海”後,應用的頁面是否顯示正常。針對有問題的頁面,做特殊適配。如有需要,可以通過查詢以下 Global settings 來確定「隱藏螢幕劉海」是否開啟了,然後再作針對性優化。
Settings.Global.getInt(mContext.getContentResolver(), "force_black", 0) == 1
華為全面屏適配方案 - 官方文件
1、判斷是否全面屏
介面描述:
類檔案 | 介面 | 介面說明 |
---|---|---|
com.huawei.android.util.HwNotchSizeUtil | public static boolean hasNotchInScreen() | true:是劉海屏;false:非劉海屏 |
呼叫方式:
public static boolean hasNotchInScreen(Context context) { boolean ret = false; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen"); ret = (boolean) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { Log.e("AskSky", "hasNotchInScreen ClassNotFoundException"); } catch (NoSuchMethodException e) { Log.e("AskSky", "hasNotchInScreen NoSuchMethodException"); } catch (Exception e) { Log.e("AskSky", "hasNotchInScreen Exception"); } return ret; }
2、 應用頁面設定使用劉海區顯示
方案一:
使用新增的Meta-data屬性android.notch_support,在應用的AndroidManifest.xml中增加meta-data屬性,此屬性不僅可以針對Application生效,也可以對Activity配置生效
<meta-data android:name="android.notch_support" android:value="true"/>
- 對Application生效,意味著該應用的所有頁面,系統都不會做豎屏場景的特殊下移或者是橫屏場景的右移特殊處理:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:testOnly="false" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="android.notch_support" android:value="true"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
- 對Activity生效,意味著可以針對單個頁面進行劉海屏適配,設定了該屬性的Activity系統將不會做特殊處理:
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:testOnly="false" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".LandscapeFullScreenActivity" android:screenOrientation="sensor"> </activity> <activity android:name=".FullScreenActivity"> <meta-data android:name="android.notch_support" android:value="true"/> </activity>
方案二:
可以通過clearHwFlags介面清除新增的華為劉海屏Flag,恢復應用不使用劉海區顯示。
介面描述:
類檔案 | 介面 | 介面說明 |
---|---|---|
com.huawei.android.view.LayoutParamsEx | public void clearHwFlags (int hwFlags) | 通過去除視窗FLAG的方式設定頁面不使用劉海區顯示: |
呼叫方式:
/*劉海屏全屏顯示FLAG*/ public static final int FLAG_NOTCH_SUPPORT=0x00010000; /** * 設定應用視窗在華為劉海屏手機使用劉海區 * @param window 應用頁面window物件 */ public static void setNotFullScreenWindowLayoutInDisplayCutout (Window window) { if (window == null) { return; } WindowManager.LayoutParams layoutParams = window.getAttributes(); try { Class layoutParamsExCls = Class.forName("com.huawei.android.view.LayoutParamsEx"); Constructor con=layoutParamsExCls.getConstructor(LayoutParams.class); Object layoutParamsExObj=con.newInstance(layoutParams); Method method=layoutParamsExCls.getMethod("clearHwFlags", int.class); method.invoke(layoutParamsExObj, FLAG_NOTCH_SUPPORT); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |InstantiationException | InvocationTargetException e) { Log.e("AskSky", "hw clear notch screen flag api error"); } catch (Exception e) { Log.e("AskSky", "other Exception"); } }
華為劉海屏flag動態新增和刪除程式碼:
btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(isAdd) {//add flag isAdd = false; NotchSizeUtil.setFullScreenWindowLayoutInDisplayCutout(getWindow()); getWindowManager().updateViewLayout(getWindow().getDecorView(),getWindow().getDecorView().getLayoutParams()); } else{//clear flag isAdd = true; NotchSizeUtil.setNotFullScreenWindowLayoutInDisplayCutout(getWindow()); getWindowManager().updateViewLayout(getWindow().getDecorView(),getWindow().getDecorView().getLayoutParams()); } } });
3、華為隱藏劉海區開關適配
華為系統提供隱藏劉海區開關供使用者選擇,當用戶開啟該開關後會出現以下幾種情況
- 未適配劉海屏頁面:橫豎屏都會做頁面移動處理,防止被遮擋
- 做過劉海屏適配,橫屏狀態:頁面右移,劉海區域塗黑。建議按照未適配劉海平的方案處理
- 做過劉海屏適配,豎屏狀態:頁面不會下移處理,狀態列塗黑,狀態列會覆蓋在頁面上方,此時整個狀態列區域都會出現遮擋問題。建議按照適配劉海屏的方案處理,佈局原則應遵從狀態列區域不顯示文字和重要內容。
為了更好的適配劉海區開關功能,華為提供相關API來判斷使用者是否開啟隱藏劉海區開關:
public static final String DISPLAY_NOTCH_STATUS = "display_notch_status"; int mIsNotchSwitchOpen = Settings.Secure.getInt(getContentResolver(),DISPLAY_NOTCH_STATUS, 0); // 0表示“預設”,1表示“隱藏顯示區域”

華為劉海屏開關效果
OPPO全面屏適配方案 - 官方文件
1、判斷是否全面屏
context.getPackageManager().hasSystemFeature(“com.oppo.feature.screen.heteromorphism”)
返回 true為凹形屏 ,可識別OPPO的手機是否為凹形屏。
2、 應用頁面設定使用劉海區顯示
方案一:
AndroidManifest.xml中配置支援最大高寬比
<meta-data android:name="android.max_aspect"android:value="ratio_float" /> android:maxAspectRatio="ratio_float"(Android8.0以上) ratio_float = 螢幕高 / 螢幕寬
(如oppo新機型螢幕解析度為2280 x 1080, ratio_float = 2280 / 1080 = 2.11,建議設定 ratio_float為2.2或者更大)
方案二:
支援分屏,注意驗證分屏下介面相容性
android:resizeableActivity=”true” (Android7.0以上)
由於設定 maxAspectRatio
和 resizeableActivity
方案都有API版本限制,因此使用 <meta-data android:name="android.max_aspect" android:value="ratio_float" />
可以不需要考慮版本號相容問題,但如果APP本身需要支援分屏,則使用方案二最佳
3、獲取挖孔區域大小
獲取ro.oppo.screen.heteromorphism屬性值可獲取凹形區域的範圍,例 [ro.oppo.screen.heteromorphism]: [378,0:702,80],含義如下
-
378:表示豎屏下左上角橫座標
-
0 :表示豎屏下左上角豎座標
-
702:表示豎屏下右下角橫座標
-
80 :表示豎屏下右下角豎座標
呼叫方式:
String mProperty = ""; mProperty = SystemProperties.get("ro.oppo.screen.heteromorphism"); …… public static class SystemProperties { public static String get(String key) { String value = ""; Class<?> cls = null; try { cls = Class.forName("android.os.SystemProperties"); Method hideMethod = cls.getMethod("get", String.class); Object object = cls.newInstance(); value = (String) hideMethod.invoke(object, key); } catch (ClassNotFoundException e) { Log.e("AskSky", "get error() ", e); } catch (NoSuchMethodException e) { Log.e("AskSky", "get error() ", e); } catch (InstantiationException e) { Log.e("AskSky", "get error() ", e); } catch (IllegalAccessException e) { Log.e("AskSky", "get error() ", e); } catch (IllegalArgumentException e) { Log.e("AskSky", "get error() ", e); } catch (InvocationTargetException e) { Log.e("AskSky", "get error() ", e); } return value; } }

凹槽區域尺寸示意圖
VIVO全面屏適配方案 - 官方文件
1、判斷是否全面屏
介面描述:
包名:android.util.FtFeature
介面:public static boolean isFtFeatureSupport (int mask)
引數說明:
0x00000020表示是否有凹槽 0x00000008表示是否有圓角
返回值: true表示有此特徵
呼叫方式:
public static final int HAS_GROOVE = 0x00000020; public static final int HAS_CIRCULAR = 0x00000008; private void initView() { boolean hasGroove = isFtFeatureSupport(HAS_GROOVE); boolean hasCircular = isFtFeatureSupport(HAS_CIRCULAR); Log.d("AskSky", "是否有劉海屏:" + hasGroove); Log.d("AskSky", "是否有圓角:" + hasCircular); } @SuppressLint("PrivateApi") private boolean isFtFeatureSupport(int tag) { boolean value = false; try { Class<?> cls = Class.forName("android.util.FtFeature"); Method hideMethod = cls.getMethod("isFtFeatureSupport", int.class); Object object = cls.newInstance(); value = (boolean) hideMethod.invoke(object, tag); } catch (ClassNotFoundException e) { Log.e("AskSky", "get error() ", e); } catch (NoSuchMethodException e) { Log.e("AskSky", "get error() ", e); } catch (InstantiationException e) { Log.e("AskSky", "get error() ", e); } catch (IllegalAccessException e) { Log.e("AskSky", "get error() ", e); } catch (IllegalArgumentException e) { Log.e("AskSky", "get error() ", e); } catch (InvocationTargetException e) { Log.e("AskSky", "get error() ", e); } return value; }
2、應用頁面設定使用劉海區 與OPPO設定方式相同
方案一:
AndroidManifest.xml中配置支援最大高寬比
<meta-data android:name="android.max_aspect"android:value="ratio_float" /> android:maxAspectRatio="ratio_float"(Android8.0以上) ratio_float = 螢幕高 / 螢幕寬
(如oppo新機型螢幕解析度為2280 x 1080, ratio_float = 2280 / 1080 = 2.11,建議設定 ratio_float為2.2或者更大)
方案二:
支援分屏,注意驗證分屏下介面相容性
android:resizeableActivity=”true” (Android7.0以上)
由於設定 maxAspectRatio
和 resizeableActivity
方案都有API版本限制,因此使用 <meta-data android:name="android.max_aspect" android:value="ratio_float" />
可以不需要考慮版本號相容問題,但如果APP本身需要支援分屏,則使用方案二最佳
個人認為,VIVO官方文件是最坑爹的,僅告訴你方法名和引數,但沒有具體Demo,只能自己閉著眼寫
其次,VIVO沒有提供獲取挖孔屏位置的官方API,因此,在開發過程中只能獲取狀態列高度,儘量避免在狀態列區域顯示重要內容和文字
關於圓角邊,VIVO官方建議是 半徑小於50dp的區域為安全區域 ,但官方又說了,儘量不要考慮圓角的具體半徑,儘量只考慮圓角遮蓋問題,儘量將內容放到安全區域。
對於全面屏適配的一些建議
1、宣告 Maximum Aspect Ratio
Android 標準介面中,支援應用宣告其支援的最大螢幕高寬比(maximum aspect ratio)。具體宣告如下,其中的 ratio_float 被定義為是高除以寬,以 16:9 為例,ratio_float = 16/9 = 1.778 (18:9則為2.0)。
<application> <meta-data android:name="android.max_aspect" android:value="ratio_float" /> </application>
若開發者沒有宣告該屬性,ratio_float 的預設值為1.86,小於2.0,因此這類應用在全面屏手機上,預設不會全屏顯示,螢幕底部會留黑。考慮到將有更多 19.5:9 甚至更長的手機出現,建議開發者宣告 Maximum Aspect Ratio ≥ 2.2 或更多。值得一提的是,如果應用的 android:resizeableActivity 已經設定為 true,就不必設定 Maximum Aspect Ratio 了。詳見 Android 官方文件 Declaring maximum aspect ratio 。
2、避免內容拉伸、變形
從16:9變成18:9甚至更長的比例,圖片往往被會拉伸變形,此問題常見於應用開屏圖。開發者應使用更靈活的佈局,以適應不同的螢幕比例。
3、充分利用螢幕空間
開發者應充分利用全面屏顯示更多內容。如下圖,王者榮耀已修改了 Maximum Aspect Ratio,在全面屏有更寬闊的遊戲視野

王者榮耀對比2.png
4、虛擬按鍵適配
為了實現更高的屏佔比,螢幕內的虛擬導航鍵就成了標準功能,如何讓其應用介面在視覺上統一,同樣需要開發者的積極適配。Android 已經有相關介面允許開發者自定義虛擬鍵的樣式,以下是可供選擇的樣式。

虛擬鍵的樣式.png
修改虛擬按鍵樣式,Android 有標準的實現方式, 呼叫以下介面即可 window.setNavigationBarColor (int color) 。在呼叫該介面時,還需要設定一些flag
/** * Sets the color of the navigation bar to {@param color}. * * For this to take effect, * the window must be drawing the system bar backgrounds with * {@link android.view.WindowManager.LayoutParams#FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS} and * {@link android.view.WindowManager.LayoutParams#FLAG_TRANSLUCENT_NAVIGATION} must not be set. * * If {@param color} is not opaque, consider setting * {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and * {@link android.view.View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}. * <p> * The transitionName for the view background will be "android:navigation:background". * </p> */ public abstract void setNavigationBarColor(@ColorInt int color);
以上內容是我根據各大官方文件總結寫的,如有遺漏歡迎指正。其中Android9.0適配,我廢了一上午時間叭叭的全文翻譯出來了,真心不容易,如有轉載,請註明出處
QQ:1195211669