欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

API處理Android安全距離詳情

 更新時(shí)間:2022年06月15日 11:29:54   作者:? de得得de?  ?  
這篇文章主要介紹了API處理Android安全距離詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

前言

在Android屏幕的空間中,大部分的區(qū)域我們都是可以隨意繪制,只有一部分區(qū)域是顯示的固定內(nèi)容:

  • 狀態(tài)欄
  • 標(biāo)題欄(ActionBar)
  • 頁(yè)面內(nèi)容(Content)
  • 導(dǎo)航欄

其中標(biāo)題欄是可選的,除了Material風(fēng)格的應(yīng)用應(yīng)用的并不多,頁(yè)面內(nèi)容就是android.R.id.content是Activity的主要內(nèi)容。

而我們主要需要討論的就是 狀態(tài)欄和導(dǎo)航欄,因?yàn)檫@兩個(gè)區(qū)域在不同設(shè)備類型,不同的Android版本和不同的廠商下大小和效果是不同的,等等。這些差異無(wú)疑增加了我們做頁(yè)面適配的復(fù)雜程度,也更容易出現(xiàn)兼容問(wèn)題。

在2017年下半年iPhone X的發(fā)布,引入了劉海屏設(shè)備,導(dǎo)致了藍(lán)綠大廠爭(zhēng)相效仿,同時(shí)又自成一派,頗有一番百家爭(zhēng)鳴之象。 這也導(dǎo)致了一個(gè)新的問(wèn)題 劉海區(qū)域適配 ,那時(shí)候Android才8.1,并沒有API來(lái)支持這屏幕上這多出來(lái)的一塊區(qū)域,不過(guò)好在大部分設(shè)備在定制時(shí)劉海和狀態(tài)欄高度是一致的

終于在2018年發(fā)布的Android 9中Google正式支持了劉海屏,定制了規(guī)范約束了設(shè)備廠商,減輕了劉海屏適配的差異問(wèn)題,但是根源問(wèn)題并沒有解決。因?yàn)閯⒑^(qū)域的存在,可能會(huì)出現(xiàn)頁(yè)面內(nèi)容被遮擋,比如:?jiǎn)⒂庙?yè)廣告跳過(guò)按鈕被遮擋的問(wèn)題,導(dǎo)致被應(yīng)用商店拒掉的風(fēng)險(xiǎn)。

不過(guò)好在Android 9中要求劉海設(shè)備必須有以下行為:

  • 一條邊緣最多只能包含一個(gè)劉海。
  • 一臺(tái)設(shè)備不能有兩個(gè)以上的劉海。
  • 設(shè)備的兩條較長(zhǎng)邊緣上不能有劉海。
  • 在未設(shè)置特殊標(biāo)志的豎屏模式下,狀態(tài)欄的高度必須與劉海的高度持平。
  • 默認(rèn)情況下,在全屏模式或橫屏模式下,整個(gè)劉海區(qū)域必須顯示黑邊。

劉海高度默認(rèn)是和狀態(tài)欄高度一致依舊沒有變,所以問(wèn)題又回到了狀態(tài)欄區(qū)域的處理。

描述

所以肯定有同學(xué)說(shuō)了:直接獲取狀態(tài)欄高度不就可以了適配劉海屏了。像這樣:

val top = context.getStatusBarHeight()
titleBar.setPadding(0, top, 0, 0)

這么說(shuō)也沒有錯(cuò),大部分情況下是沒有問(wèn)題的。但是既然官方已經(jīng)適配劉海屏了,也為我們提供了新的API為什么不用呢:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    window.decorView.post {
        val top = window.decorView.rootWindowInsets?.displayCutout?.safeInsetTop ?: 0
        // val bottom = window.decorView.rootWindowInsets?.displayCutout?.safeInsetBottom ?: 0
        titleBar.setPadding(0, top, 0, 0)
    }
}

上面的方案實(shí)際上可以獲取上下左右四個(gè)方向的安全距離,但大部分情況我們只需要處理頂部就可以了。實(shí)際上這已經(jīng)可以解決我們的問(wèn)題了,但是還有更好的解決方案方案:

添加依賴:

implementation 'androidx.core:core:1.7.0'

// 老版本也可以,但是getInsets() API 還沒添加
// implementation 'androidx.core:core:1.3.0'

使用ViewCompat工具:

ViewCompat.setOnApplyWindowInsetsListener(titleBar) { view: View, insets: WindowInsetsCompat ->
    //val top = insets.systemWindowInsetTop // 高版本已經(jīng)過(guò)時(shí),可以用下面的api替換
    val stableInsets = insets.getInsets(
    WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout())
    titleBar.setPadding(0, stableInsets.top, 0, 0)
    return@setOnApplyWindowInsetsListener insets
}

實(shí)際上屏幕安全距離,基本上全部圍繞這一個(gè)API,Google也推薦我們這么做,在很多系統(tǒng)控件都能看到它的影子,比如:AppBarLayout、DrawerLayout、NavigationBarView等等都有用到,內(nèi)部都是來(lái)處理系統(tǒng)安全距離的。

系統(tǒng)欄適配

上面提到了手機(jī)有各種系統(tǒng)欄(狀態(tài)欄、導(dǎo)航欄),如果一個(gè)全屏+劉海屏+透明系統(tǒng)欄+屏幕旋轉(zhuǎn)的頁(yè)面處理這些安全距離就更復(fù)雜,比如短視頻頁(yè),這里先給大家列幾條可能出現(xiàn)的問(wèn)題:

  • 沒有導(dǎo)航欄或者可以動(dòng)態(tài)隱藏導(dǎo)航欄的設(shè)備
  • 導(dǎo)航欄不會(huì)旋轉(zhuǎn)的設(shè)備(就是導(dǎo)航欄一直在屏幕的一個(gè)邊,不會(huì)跟隨屏幕旋轉(zhuǎn))
  • 導(dǎo)航欄跟隨屏幕旋轉(zhuǎn)的設(shè)備(主要是手勢(shì)導(dǎo)航的設(shè)備和一些平板上)
  • 劉海在屏幕底部的設(shè)備(開發(fā)者選項(xiàng)可以開啟雙劉海模式,設(shè)備兩個(gè)短邊都有劉海)
  • 底部劉海+導(dǎo)航欄一起顯示的設(shè)備
  • ... ...

這些所有的問(wèn)題通過(guò) ViewCompat.setOnApplyWindowInsetsListener() 來(lái)優(yōu)雅處理, 通過(guò) WindowInsetsCompat.getInsets(type) 可以獲取系統(tǒng)的各個(gè)欄的大小, 我們也可以同時(shí)獲取多個(gè)系統(tǒng)欄的高度,各個(gè)距離內(nèi)部會(huì)進(jìn)行累加,返回一個(gè)類似Rect的對(duì)象,對(duì)應(yīng)屏幕的左上右下需要插入的距離:

val stableInsets = insets.getInsets(
    WindowInsetsCompat.Type.statusBars() or
    WindowInsetsCompat.Type.navigationBars() or
    WindowInsetsCompat.Type.displayCutout())

然后在對(duì)不同位置的控件添加對(duì)應(yīng)的邊距。除了上面提到的三種類型的安全距離,還有一些其他的類型,有興趣的可以自己了解。

其他適配

ViewCompat.setOnApplyWindowInsetsListener()能解決大部分安全距離的問(wèn)題,但是有一點(diǎn)它是處理不了的,就是 屏幕圓角,這些安全距離的計(jì)算是不處理屏幕圓角的,所以如果有圓角要處理那我們就要另辟蹊徑了。

好在Android 12中官方添加了對(duì)圓角的支持:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val roundedCorner = insets.toWindowInsets()
        ?.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT)
    roundedCorner?.center
}

我用了Pixel4真機(jī)發(fā)現(xiàn)能獲取到數(shù)據(jù),但是模擬器獲取不到。

除了圓角支持,還有對(duì)隱私指示器提供了支持:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val rect = insets.toWindowInsets()?.privacyIndicatorBounds
    // 頁(yè)面控件需要避開這個(gè)區(qū)域,不然可能會(huì)被遮擋
}

隱私指示器的范圍,主要是 攝像頭和麥克風(fēng) 使用中狀態(tài)的指示器邊界,如果是錄制直播或者相機(jī)的頁(yè)面需要處理這個(gè)區(qū)域。

除了圓角以外,好像沒有找到官方對(duì)打孔屏的支持,可能后面會(huì)加入對(duì)打孔屏的支持吧。

到此這篇關(guān)于API處理Android安全距離詳情的文章就介紹到這了,更多相關(guān) Android安全距離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Flutter組件開發(fā)過(guò)程完整講解

    Flutter組件開發(fā)過(guò)程完整講解

    這篇文章主要介紹了Flutter組件開發(fā)過(guò)程,F(xiàn)lutter是Google開源的構(gòu)建用戶界面(UI)工具包,幫助開發(fā)者通過(guò)一套代碼庫(kù)高效構(gòu)建多平臺(tái)精美應(yīng)用,支持移動(dòng)、Web、桌面和嵌入式平臺(tái)。Flutter 開源、免費(fèi),擁有寬松的開源協(xié)議,適合商業(yè)項(xiàng)目
    2022-11-11
  • Android自定義View實(shí)現(xiàn)loading動(dòng)畫加載效果

    Android自定義View實(shí)現(xiàn)loading動(dòng)畫加載效果

    項(xiàng)目開發(fā)中對(duì)Loading的處理是比較常見的,安卓系統(tǒng)提供的不太美觀,引入第三發(fā)又太麻煩,這時(shí)候自己定義View來(lái)實(shí)現(xiàn)這個(gè)效果。這篇文章主要介紹了Android自定義View實(shí)現(xiàn)loading動(dòng)畫加載效果,需要的朋友可以參考下
    2017-03-03
  • Android Socket通信詳解

    Android Socket通信詳解

    這篇文章主要介紹了Android Socket通信詳解的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 微信小程序電商常用倒計(jì)時(shí)實(shí)現(xiàn)實(shí)例

    微信小程序電商常用倒計(jì)時(shí)實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了微信小程序電商常用倒計(jì)時(shí)實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • OpenGL Shader實(shí)例分析(4)閃光效果

    OpenGL Shader實(shí)例分析(4)閃光效果

    這篇文章主要為大家詳細(xì)介紹了OpenGL Shader實(shí)例分析第4篇,實(shí)現(xiàn)閃光效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Flutter實(shí)現(xiàn)可以縮放拖拽的圖片示例代碼

    Flutter實(shí)現(xiàn)可以縮放拖拽的圖片示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Flutter實(shí)現(xiàn)可以縮放拖拽的圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 詳解Android的Handler機(jī)制原理

    詳解Android的Handler機(jī)制原理

    Android的Handler機(jī)制是一種用于處理和調(diào)度線程之間消息傳遞的機(jī)制,通常用于在后臺(tái)線程中執(zhí)行任務(wù),并將結(jié)果返回到主線程中更新UI,Handler機(jī)制的核心是Message和MessageQueue,以及Looper,本文給大家詳細(xì)講解了Android的Handler機(jī)制原理,需要的朋友可以參考下
    2023-10-10
  • android中使用Activity實(shí)現(xiàn)監(jiān)聽手指上下左右滑動(dòng)

    android中使用Activity實(shí)現(xiàn)監(jiān)聽手指上下左右滑動(dòng)

    這篇文章主要介紹了android中使用Activity實(shí)現(xiàn)監(jiān)聽手指上下左右滑動(dòng),本文使用了Activity的ontouchEvent方法監(jiān)聽手指點(diǎn)擊事件,并給出代碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • 最新評(píng)論