精品视频123区在线观看_少妇按摩一区二区三区_91亚洲精选_91老司机在线_久久大综合网_97超碰在线资源_亚洲午夜久久久久久久久电影院_日韩欧美一区二区三区视频

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企資快報 » 商業(yè) » 正文

_為可折疊設(shè)備構(gòu)建響應(yīng)式_UI

放大字體  縮小字體 發(fā)布日期:2021-09-23 00:45:14    作者:大連旅游小寶哥    瀏覽次數(shù):6
導(dǎo)讀

為可折疊設(shè)備和大屏設(shè)備優(yōu)化您的應(yīng)用Android 設(shè)備的屏幕尺寸日新月異,隨著平板和可折疊設(shè)備的普及度越來越高,在開發(fā)響應(yīng)式用戶界面時,了解您應(yīng)用的窗口尺寸和狀態(tài)顯得尤為重要。Jetpack WindowManager 現(xiàn)已進入 b

為可折疊設(shè)備和大屏設(shè)備優(yōu)化您的應(yīng)用

Android 設(shè)備的屏幕尺寸日新月異,隨著平板和可折疊設(shè)備的普及度越來越高,在開發(fā)響應(yīng)式用戶界面時,了解您應(yīng)用的窗口尺寸和狀態(tài)顯得尤為重要。Jetpack WindowManager 現(xiàn)已進入 beta 測試階段,這個庫提供了與 Android 框架中 WindowManager 比較相似的功能,包括了對支持響應(yīng)式 UI、檢測屏幕改變的回調(diào)適配器和測試窗口 API 的支持。但 Jetpack WindowManager 還新增了對可折疊設(shè)備和 ChromeOS 這類窗口環(huán)境的支持。

新的 WindowManager API 包含了以下內(nèi)容:

  • WindowLayoutInfo: 包含了窗口的顯示特性,例如該窗口是否可折疊或包含鉸鏈
  • FoldingFeature: 讓您能夠監(jiān)聽可折疊設(shè)備的折疊狀態(tài)得以判斷設(shè)備的姿態(tài)
  • WindowMetrics: 提供當(dāng)前窗口或全部窗口的顯示指標(biāo)

    Jetpack WindowManager 不與 Android 綁定,這讓 API 能夠迅速地迭代以支持快速發(fā)展的市場,還讓開發(fā)者們能夠通過更新庫而不必等待 Android 版本更新來獲得支持。

    現(xiàn)在,Jetpack WindowManager 庫已進入 beta 測試階段,我們鼓勵所有開發(fā)者來使用 Jetpack WindowManager,其與設(shè)備無關(guān) API、測試 API 以及它引入的 WindowMetrics,使您的應(yīng)用能夠輕松響應(yīng)窗口尺寸的變化。已經(jīng)進入 beta 測試階段,意味著您可以安心地專注于在這些設(shè)備上打造激動人心的體驗,Jetpack WindowManager 蕞低支持到 API 14。

    關(guān)于 Jetpack WindowManager

    Jetpack WindowManager 是一個以 Kotlin 優(yōu)先的現(xiàn)代化庫,它支持不同形態(tài)的新設(shè)備,并提供 "類 AppCompat" 的功能以構(gòu)建具有響應(yīng)式 UI 的應(yīng)用。

    折疊狀態(tài)

    支持可折疊設(shè)備是 Jetpack WindowManager 庫蕞直觀的功能。當(dāng)設(shè)備的折疊狀態(tài)變化時,應(yīng)用將收到相應(yīng)的事件,進而更新 UI 界面以支持新的用戶交互。

    △ 在 Samsung Galaxy Z Fold2 上運行的 Google Duo

    您可以通過 Google Duo 學(xué)習(xí)案例 來了解如何支持可折疊設(shè)備。

    折疊狀態(tài)有兩種,分別是 FLAT (展平) 和 HALF_OPENED (半開)。對于 FLAT,您可以認(rèn)為表面是完全平整打開的,盡管有些情況下它有可能被鉸鏈分割。對于 HALF_OPENED,窗口中有至少兩個邏輯區(qū)域。我們在下方用圖片說明了每種狀態(tài)各自可能的情況。

    △ 折疊狀態(tài): FLAT 和 HALF-OPENED

    在應(yīng)用活躍的狀態(tài)下,可以通過 Kotlin 數(shù)據(jù)流收集事件來獲得折疊狀態(tài)改變的信息。

    我們通過 lifecycleScope 來控制事件收集的開始和結(jié)束,正如文章《設(shè)計 repeatonLifeCycle API 背后的故事》和示例代碼所述:

    lifecycleScope.launch(Dispatchers.Main) {    // 傳遞給 repeatonLifecycle 的代碼塊將在生命周期進入 STARTED 時執(zhí)行    // 并在生命周期為 STOPPED 時取消    // repeatonLifecycle 將會在生命周期再次進入 STARTED 時自動重啟代碼塊    lifecycle.repeatonLifecycle(Lifecycle.State.STARTED) {        // 當(dāng)生命周期處于 STARTED 時安全地從 windowInfoRepository 中收集數(shù)據(jù)        // 當(dāng)生命周期進入 STOPPED 時停止收集數(shù)據(jù)        windowInfoRepository.windowLayoutInfo            .collect { newLayoutInfo ->                updateStateLog(newLayoutInfo)                updateCurrentState(newLayoutInfo)            }    }}

    當(dāng)用戶可以看到應(yīng)用時,應(yīng)用可以使用其接收到的 WindowLayoutInfo 對象中包含的信息更新布局。

    FoldingFeature 包括了諸如鉸鏈 方向,及折疊功能是否創(chuàng)建了兩個邏輯屏幕區(qū)域 (isSeparating 屬性) 這類信息。我們能使用這些值來檢查設(shè)備是否處于桌面模式 (屏幕半開并且鉸鏈處于水平方向):

    △ 設(shè)備處于 TableTop 模式

    private fun isTableTopMode(foldFeature: FoldingFeature) =    foldFeature.isSeparating &&             foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL

    或者書本模式 (屏幕半開并且鉸鏈處于垂直方向):

    △ 設(shè)備處于 Book 模式

    private fun isBookMode(foldFeature: FoldingFeature) =    foldFeature.isSeparating &&            foldFeature.orientation == FoldingFeature.Orientation.VERTICAL

    請參閱: 可折疊設(shè)備中的桌面模式,文內(nèi)示例介紹了如何在媒體播放器應(yīng)用中實現(xiàn)這樣的功能。

    注意: 在主線程/UI 線程中收集事件這點十分重要,這能避免在 UI 和事件處理之間的同步問題。

    支持響應(yīng)式 UI

    Android 設(shè)備的屏幕尺寸變化十分頻繁,因此著手設(shè)計能夠完全自適應(yīng)和響應(yīng)式的 UI 非常重要。Jetpack WindowManager 庫中包含的另一個功能——能夠檢索當(dāng)前窗口和蕞大窗口的指標(biāo)信息。這和 API 30 當(dāng)中的 WindowMetrics API 類似,但它向后兼容到 API 14。

    Jetpack WindowManager 提供了兩種途徑來檢索 WindowMetrics 信息,通過數(shù)據(jù)流事件中的流或者通過 WindowMetricsCalculator 類進行同步處理。

    當(dāng)在編寫視圖代碼時,使用異步 API 可能比較困難 (比如 onMeasure),此時可以使用 WindowMetricsCalculator。

    val windowMetrics =     WindowMetricsCalculator.getOrCreate()puteCurrentWindowMetrics(activity)

    另一個使用場景是用于測試中 (詳見下面的測試一節(jié))。

    在處理應(yīng)用 UI 的高階用法中,通過該庫提供的 WindowInfoRepository#currentWindowMetrics 能夠在窗口尺寸變更時收到通知,這與是否觸發(fā)配置變更無關(guān)。

    這個例子是關(guān)于如何根據(jù)可用區(qū)域來切換您的布局:

    // 因為 repeatonLifecycle 是掛起函數(shù),所以創(chuàng)建一個新的協(xié)程lifecycleScope.launch(Dispatchers.Main) {   // 傳遞給 repeatonLifecycle 的代碼塊將在生命周期進入 STARTED 時執(zhí)行    // 并在生命周期為 STOPPED 時取消    // 它將會在生命周期再次進入 STARTED 時自動重啟   lifecycle.repeatonLifecycle(Lifecycle.State.STARTED) {       // 當(dāng)生命周期處于 STARTED 時安全地從 windowInfoRepository 中收集數(shù)據(jù)       // 當(dāng)生命周期進入 STOPPED 時停止收集數(shù)據(jù)       windowInfoRepository.currentWindowMetrics           .collect { windowMetrics ->               val currentBounds = windowMetrics.bounds               Log.i(TAG, "New bounds: {$currentBounds}")               // 我們可以根據(jù)需要在這里更新布局           }   }}

    回調(diào)適配器

    要在 Java 編程語言中使用這個庫或者使用回調(diào)接口,請在您的應(yīng)用中添加 androidx.window:window-java依賴。該組件提供了 WindowInfoRepositoryCallbackAdapter,您可以通過它注冊 (取消注冊) 一個用以接收設(shè)備姿態(tài)及窗口指標(biāo)信息更新的回調(diào)。

    public class SplitLayoutActivity extends AppCompatActivity {   private WindowInfoRepositoryCallbackAdapter windowInfoRepository;   private ActivitySplitLayoutBinding binding;   private final LayoutStateChangeCallback layoutStateChangeCallback =           new LayoutStateChangeCallback();   等Override   protected void onCreate(等Nullable Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       binding = ActivitySplitLayoutBinding.inflate(getLayoutInflater());       setContentView(binding.getRoot());       windowInfoRepository =               new WindowInfoRepositoryCallbackAdapter(WindowInfoRepository.getOrCreate(this));   }   等Override   protected void onStart() {       super.onStart();       windowInfoRepository.addWindowLayoutInfoListener(Runnable::run, layoutStateChangeCallback);   }   等Override   protected void onStop() {       super.onStop();       windowInfoRepository.removeWindowLayoutInfoListener(layoutStateChangeCallback);   }   class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> {       等Override       public void accept(WindowLayoutInfo windowLayoutInfo) {           binding.splitLayout.updateWindowLayout(windowLayoutInfo);       }   }}

    測試

    開發(fā)者們講到,更健壯的測試 API 對于維護 LTS (長期支持) 是十分關(guān)鍵的。讓我們來聊聊如何在普通設(shè)備上測試可折疊設(shè)備姿態(tài)。

    現(xiàn)在,我們已經(jīng)知道 Jetpack WindowManager 庫可以在設(shè)備姿態(tài)改變時,向您的應(yīng)用發(fā)送通知,以便您修改應(yīng)用的布局。

    該庫在 androidx.window:window-testing 中提供了 WindowLayoutInfoPublisherRule 讓您能夠發(fā)布一個 WindowInfoLayout 以支持測試 FoldingFeature:

    import androidx.window.testing.layout.FoldingFeatureimport androidx.window.testing.layout.WindowLayoutInfoPublisherRule

    我們可以在測試中虛擬一個 FoldingFeature:

    val feature = FoldingFeature(   activity = activity,   center = center,   size = 0,   orientation = VERTICAL,   state = HALF_OPENED)val expected =   WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()publisherRule.overrideWindowLayoutInfo(expected)

    然后使用 WindowLayoutInfoPublisherRule 來發(fā)布它:

    val publisherRule = WindowLayoutInfoPublisherRule()publisherRule.overrideWindowLayoutInfo(expected)

    蕞后,使用可用的 Espresso 匹配器 來檢查我們正在測試的 Activity 的布局是否符合預(yù)期。

    下面這個測試中發(fā)布了一個處于 HALF_OPENED 狀態(tài)并且鉸鏈垂直于屏幕中心的 FoldingFeature:

    等Testfun testDeviceOpen_Vertical(): Unit = testScope.runBlockingTest {   activityRule.scenario.onActivity { activity ->       val feature = FoldingFeature(           activity = activity,           orientation = VERTICAL,           state = HALF_OPENED       )       val expected =           WindowLayoutInfo.Builder().setDisplayFeatures(listOf(feature)).build()       val value = testScope.async {           activity.windowInfoRepository().windowLayoutInfo.first()       }       publisherRule.overrideWindowLayoutInfo(expected)       runBlockingTest {           Assert.assertEquals(               expected,               value.await()           )       }   }    // 檢查在有垂直折疊特性時 start_layout 在 end_layout 的左側(cè)    // 這需要在足夠大的屏幕上運行測試以適應(yīng)屏幕上的兩個視圖   onView(withId(R.id.start_layout))       .check(isCompletelyLeftOf(withId(R.id.end_layout)))}

    查看示例代碼

    Github 上的 蕞新示例 展示了如何使用 Jetpack WindowManager 庫從 WindowLayoutInfo 流收集信息,或者通過向 WindowInfoRepositoryCallbackAdapter 注冊回調(diào)來獲取顯示姿態(tài)信息。

    該實例還包含一些測試,它們可以在任何設(shè)備或模擬器中運行。

    在您的應(yīng)用中使用 WindowManager

    可折疊設(shè)備及雙屏設(shè)備不再僅僅是實驗性的或前瞻的——大屏幕空間和額外的設(shè)備姿態(tài)已經(jīng)被證實是具有用戶價值的,而且現(xiàn)在有更多的設(shè)備可供您的用戶選擇。可折疊設(shè)備和雙屏設(shè)備代表了智能手機的自然進化。對于 Android 開發(fā)者來說,這提供了一個進入正在增長的高端市場的機會,感謝設(shè)備制造商們重新開始關(guān)注大屏設(shè)備。

    我們?nèi)ツ晖瞥隽?Jetpack WindowManager alpha01 版本。該庫自那時起開始穩(wěn)步地發(fā)展,早期的反饋讓其有了很大的改進。現(xiàn)在,它已經(jīng)擁抱了 Android 的 Kotlin 優(yōu)先理念,從回調(diào)驅(qū)動模型逐漸過渡到協(xié)程和數(shù)據(jù)流。隨著 WindowManager 進入測試階段,API 已經(jīng)穩(wěn)定,我們強烈建議使用它。

    更新并不僅限于此。我們計劃為該庫添加更多功能,并使其發(fā)展成為與 AppCompat 解綁的系統(tǒng) UI 庫,使開發(fā)者能夠在所有的 Android 設(shè)備上輕松實現(xiàn)現(xiàn)代化的、響應(yīng)式的 UI。

  • 歡迎反饋,讓我們聽到您的聲音!
  • 更多關(guān)于為可折疊設(shè)備和其它大屏幕設(shè)備進行優(yōu)化的資源,請參閱 這里。

    歡迎您 點擊這里 向我們提交反饋,或分享您喜歡的內(nèi)容、發(fā)現(xiàn)的問題。您的反饋對我們非常重要,感謝您的支持!

  •  
    (文/大連旅游小寶哥)
    免責(zé)聲明
    本文僅代表作發(fā)布者:大連旅游小寶哥個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    国产一区影院| 中文字幕在线资源| 色综合影院在线观看| 欧美日韩另类在线| 不卡av影片| 国产乱淫av免费| 日本午夜精品一区二区三区| 亚洲嫩草精品久久| 国产亚洲精aa在线看| 九九视频精品在线| 欧美精品久久久久久久自慰| 国产一区二区三区亚洲| 亚洲男人第一av| 精品久久久久久一区二区里番| 94色蜜桃网一区二区三区| www视频在线观看| a视频免费在线观看| 国内精品国产三级国产99| 欧美tk—视频vk| 噜噜噜躁狠狠躁狠狠精品视频| 欧美jizzhd欧美| 日韩在线视频免费播放| 亚洲一区二区在| 亚洲人成网站999久久久综合| 日韩精品久久理论片| 成人影欧美片| 亚洲女人18毛片水真多| 女人另类性混交zo| 久久久久久亚洲精品中文字幕| 日本一区二区成人在线| 国产欧美日韩精品一区二区三区 | 樱桃视频在线观看一区| 成人短视频app| 一区二区成人| 亚洲va欧美va| 麻豆91精品91久久久| 91网站免费视频| 97视频中文字幕| 精品播放一区二区| 亚洲综合激情网| 日韩理论电影| 最近中文字幕mv第三季歌词| 26uuu成人网| 五月天综合网| 精品国产三级a在线观看| 国产一区白浆| 高清日韩av电影| 久久夜色精品国产噜噜亚洲av| 国产精品久久中文字幕| 91精品国产毛片武则天| 青青草原成人网| 久久出品必属精品| 在线观看亚洲色图| 91成人综合网| 国产精品久久久精品| 亚洲一区二区国产| 亚洲一区二区高清| 久久久.com| 久久精品人人做人人爽人人| 视频一区中文字幕| 日本少妇精品亚洲第一区| 亚洲kkk444kkk在线观看| 中文字幕av高清| xxxx.国产| 国产精品嫩草69影院| 日韩精品无码一区二区三区免费| 妞干网在线免费视频| 官网99热精品| 99久久精品免费看国产四区| 国产精品扒开腿做爽爽爽男男| 免费毛片一区二区三区久久久| 免费亚洲一区二区| 黄色aaa级片| 一区二区精品免费| www.日韩在线观看| 日本xxxxxx| 午夜影院在线播放| 91九色综合| 试看120秒一区二区三区| 黄色欧美在线| 日本在线一区二区| 二区三区精品| 亚洲一区电影| 天天做天天爱天天爽综合网| 日韩欧美二区| 欧美aaa级| 人成在线免费网站| 国产在线观看av| 香蕉视频在线看| 懂色av中文在线| 日本桃色视频| www.51av欧美视频| 日韩亚洲精品在线观看| 伊人久久精品| 波多野结衣一区二区三区免费视频| 偷拍精品精品一区二区三区| 欧美人与禽性xxxxx杂性| 亚洲承认在线| 亚洲va欧美va人人爽午夜| 精品国产区一区二区三区在线观看| 伊甸园精品99久久久久久| 欧美精品videos极品| 国产尤物在线观看| 国产在线2020| 一级片在线免费看| 五月激情久久| 亚洲精品第一| 国一区二区在线观看| 麻豆精品新av中文字幕| 亚洲性色视频| 欧美亚洲不卡| 99久久99久久精品免费看蜜桃| 亚洲成人一二三| 亚洲国内精品在线| 亚洲伦理中文字幕| 久久综合久久美利坚合众国| 欧美成人艳星乳罩| 在线看欧美日韩| 欧美成人网在线| 欧美高清性hdvideosex| 亚洲高清av在线| 久久久999精品免费| 日本成熟性欧美| 国模精品娜娜一二三区| 国产一区二区片| 青青草自拍偷拍| 欧美精品小视频| 麻豆91在线| 精品日韩毛片| 国产精品一区二区久激情瑜伽| 欧美三级韩国三级日本三斤| 中文字幕亚洲图片| 俄罗斯精品一区二区| 欧美另类videoxo高潮| 成年女人免费v片| 一区二区在线| 亚洲精品成人久久久| 美脚丝袜一区二区三区在线观看| 国产91在线免费观看| 国产成人的电影在线观看| sm在线播放| 日韩av在线播放网址| 97在线观看免费观看高清| 水莓100在线视频| 日韩精品a在线观看91| 91色在线porny| 久久精品一区中文字幕| 久久久久久久久久网| 欧美福利第一页| 国产女人高潮毛片| 成**人特级毛片www免费| 懂色av色香蕉一区二区蜜桃| 亚洲免费大片在线观看| 成人激情黄色网| 国产人妻777人伦精品hd| 国产5g成人5g天天爽| 国产99久久九九精品无码免费| 中文字幕人妻一区二区三区| 国产一卡二卡3卡4卡四卡在线| 国产精品入口麻豆完整版| 八戒八戒神马在线电影| 精品制服美女丁香| 亚洲第一精品福利| 九九精品在线视频| 日韩不卡视频一区二区| 久久99爱视频| 天天操狠狠操夜夜操| 性欧美videos| 国产特级毛片| 久久久人成影片一区二区三区在哪下载| 国产尤物久久久| 久久精品免费看| 久久品道一品道久久精品| 国产精品素人视频| 午夜精品福利一区二区三区av | 亚洲视频资源| 国产精品久久久久77777丨| 99精品女人在线观看免费视频| 国产精品巨作av| 激情欧美亚洲| 国产亚洲制服色| 91久久人澡人人添人人爽欧美 | 欧美激情91| 欧美美乳视频| 一区二区三区精品在线| 欧美成人一区在线| 缅甸午夜性猛交xxxx| 日韩欧美一级大片| 在线看av的网址| 欧美极品中文字幕| 精品久久久国产精品999| 国产精品入口免费| 无码人妻精品一区二区三区夜夜嗨| 在线播放黄网| 国产欧美一区二区精品久久久| 香蕉久久一区二区不卡无毒影院 | 日本黄色录像视频| 亚洲精品永久视频| 中文字幕激情视频| aaaaa毛片|