360度全景街景地圖陽江seo
一、劉海屏適配
1、layoutInDisplayCutoutMode屬性
Android 9.0系統(tǒng)中提供了3種layoutInDisplayCutoutMode屬性來允許應(yīng)用自主決定該如何對(duì)劉海屏設(shè)備進(jìn)行適配。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
這是一種默認(rèn)的屬性,在不進(jìn)行明確指定的情況下,系統(tǒng)會(huì)自動(dòng)使用這種屬性。這種屬性允許應(yīng)用程序的內(nèi)容在豎屏模式下自動(dòng)延伸到劉海區(qū)域,而在橫屏模式下則不會(huì)延伸到劉海區(qū)域。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
這種屬性表示,不管手機(jī)處于橫屏還是豎屏模式,都會(huì)允許應(yīng)用程序的內(nèi)容延伸到劉海區(qū)域。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 這種屬性表示,永遠(yuǎn)不允許應(yīng)用程序的內(nèi)容延伸到劉海區(qū)域。
2、配置layoutInDisplayCutoutMode的方式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
layoutInDisplayCutoutMode使用默認(rèn)值,即我們不去設(shè)置。即使我們不做任何的適配工作,絕大多數(shù)的程序在默認(rèn)情況下也是可以自動(dòng)適配劉海屏手機(jī)的,并不會(huì)產(chǎn)生應(yīng)用程序無法使用等問題的發(fā)生。
但是,假如你開發(fā)的是一款視頻類應(yīng)用或者游戲的話(橫屏顯示),充分利用屏幕的空間明顯可以帶來更好的用戶體驗(yàn),界面上留著一條大黑邊對(duì)用戶總歸是不夠友好的。這個(gè)時(shí)候我們就可以通過指定layoutInDisplayCutoutMode屬性的值,來讓應(yīng)用程序具備更好的屏幕適配性。
?
?
紅色箭頭處有條大黑邊。如果我們將layoutInDisplayCutoutMode設(shè)置為LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,大黑邊就會(huì)消失。并且設(shè)置沉浸式布局
override fun onWindowFocusChanged(hasFocus: Boolean) {super.onWindowFocusChanged(hasFocus)if (hasFocus && Build.VERSION.SDK_INT >= 19) {val decorView = window.decorViewdecorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_FULLSCREENor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)}
}
?3、需要適配的地方
但是界面上交互的一些按鍵可能被劉海擋住,這樣用戶就不能點(diǎn)擊了。
我們左邊的按鍵被劉海擋住一部分。這種情況就需要我們進(jìn)行適配了。DisplayCutout類主要用于獲取凹口位置和安全區(qū)域的位置等。主要方法如下所示:
getBoundingRects():返回Rects的列表,每個(gè)Rects都是顯示屏上非功能區(qū)域的邊界矩形。
getSafeInsetLeft ():返回安全區(qū)域距離屏幕左邊的距離,單位是px。
getSafeInsetRight ():返回安全區(qū)域距離屏幕右邊的距離,單位是px。
getSafeInsetTop ():返回安全區(qū)域距離屏幕頂部的距離,單位是px。
getSafeInsetBottom():返回安全區(qū)域距離屏幕底部的距離,單位是px。
?
適配代碼如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {root_layout.setOnApplyWindowInsetsListener { view, windowInsets ->val displayCutout = windowInsets.displayCutoutif (displayCutout != null) {val left = displayCutout.safeInsetLeftval top = displayCutout.safeInsetTopval right = displayCutout.safeInsetRightval bottom = displayCutout.safeInsetBottomval leftParams: FrameLayout.LayoutParams = btn_left.layoutParams as FrameLayout.LayoutParamsleftParams.setMargins(left, top, right, bottom)}windowInsets.consumeSystemWindowInsets()}
}
?
root_layout是界面的根布局,上面代碼就是獲取安全區(qū)域,將按鈕設(shè)置在安全區(qū)域以外。
?
現(xiàn)在按鈕就沒有被劉海擋住了。
二、non-SDK接口限制
一般來說,SDK 接口是指在 Android 框架軟件包索引中記錄的接口。 對(duì)非 SDK 接口的處理是 API 抽象化的實(shí)現(xiàn)細(xì)節(jié);其會(huì)隨時(shí)更改。
Android P 引入了針對(duì)非 SDK 接口的新使用限制,無論是直接使用還是通過反射或 JNI 間接使用。 無論應(yīng)用是引用非 SDK 接口還是嘗試使用反射或 JNI 獲取其句柄,均適用這些限制。
名單分類:
Light grey list: targetSDK>=P時(shí),警告;
Dark grey list:targetSDK<P時(shí),警告;>=p時(shí),不允許調(diào)用;
Black list:三方應(yīng)用不允許調(diào)用;
三、Battery Improvements
谷歌在P版本之前沒有一個(gè)完整的功耗解決方案,OEM廠商分別開發(fā)各自的功耗方案,管控手段都包括了清理應(yīng)用,功耗得到優(yōu)化,但是同時(shí)也影響了三方應(yīng)用的一些功能正常使用,谷歌為了解決這個(gè)問題在P版本提出了自己的功耗解決方案。
主要方案:
AAB(Auto Awesome Battery):
1、通過ML算法將應(yīng)用進(jìn)行分類,不同類型的應(yīng)用功耗管控策略不一樣
2、Firebase Cloud Messaging (FCM):管控三方消息接收的頻率
3、谷歌提供了統(tǒng)一的應(yīng)用的管控方法:Forced App Standby (FAS),谷歌不會(huì)通過清理應(yīng)用來優(yōu)化功耗
Extreme Battery Saver(EBS)谷歌超級(jí)省電模式;
Smart screen brightness:屏幕亮度調(diào)節(jié)優(yōu)化算法。
影響
谷歌功耗方案對(duì)三方應(yīng)用各種管控,存在導(dǎo)致應(yīng)用后臺(tái)功能無法正常使用的可能,特別是:IM、郵箱、鬧鐘、音樂(直播)、地圖導(dǎo)航、運(yùn)動(dòng)健康、下載、日歷等應(yīng)用影響比較大。目前通過谷歌提供的調(diào)試命令驗(yàn)證:所有的應(yīng)用都有可能會(huì)被分到管控的類型,對(duì)三方的后臺(tái)功能是有影響的。
?