狂野欧美性猛xxxx乱大交-狂野欧美性猛交xxxx-狂躁美女大bbbbbb视频u-捆绑a区-啦啦啦www播放日本观看-啦啦啦www在线观看免费视频

二維碼
企資網(wǎng)

掃一掃關注

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

_為可折疊設備構建響應式_UI

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

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

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

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

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

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

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

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

    關于 Jetpack WindowManager

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

    折疊狀態(tài)

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

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

    您可以通過 Google Duo 學習案例 來了解如何支持可折疊設備。

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

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

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

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

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

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

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

    △ 設備處于 TableTop 模式

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

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

    △ 設備處于 Book 模式

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

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

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

    支持響應式 UI

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

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

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

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

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

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

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

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

    回調(diào)適配器

    要在 Java 編程語言中使用這個庫或者使用回調(diào)接口,請在您的應用中添加 androidx.window:window-java依賴。該組件提供了 WindowInfoRepositoryCallbackAdapter,您可以通過它注冊 (取消注冊) 一個用以接收設備姿態(tài)及窗口指標信息更新的回調(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 (長期支持) 是十分關鍵的。讓我們來聊聊如何在普通設備上測試可折疊設備姿態(tài)。

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

    該庫在 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 的布局是否符合預期。

    下面這個測試中發(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 的左側    // 這需要在足夠大的屏幕上運行測試以適應屏幕上的兩個視圖   onView(withId(R.id.start_layout))       .check(isCompletelyLeftOf(withId(R.id.end_layout)))}

    查看示例代碼

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

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

    在您的應用中使用 WindowManager

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

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

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

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

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

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

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

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

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

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 欧美色视频超清在线观看 | 亚洲欧美日韩一级特黄在线 | 色婷婷香蕉| 欧美精品观看 | 日产国产精品久久久久久 | 精品日韩一区二区三区视频 | 不卡免费在线视频 | 丁香婷婷成人 | 在线日韩观看 | 四虎影永久在线高清免费 | 国产最新精品 | 97色在线观看免费视频 | 久久成人精品 | 久久黄色视屏 | 久操视频网站 | 亚洲精品国产成人专区 | 国产中文字幕视频在线观看 | 久久久久在线观看 | 国产美女做爰免费视 | xxxwww欧美 | 爱我久久国产精品 | 成人a毛片一级 | 91在线亚洲 | 免费看一级大片 | 99视频在线免费观看 | 成人97在线观看免费高清 | 日日日视频 | 国产精品嘿咻嘿咻在线播放 | 久久草在线观看 | 狠狠色丁香婷综合久久 | 99久久99久久免费精品蜜桃 | 午夜精品影院 | 中文字幕精品一区二区精品 | 国产一区二区三区视频 | 日韩免费不卡视频 | 高清国产美女一级a毛片录 高清国产美女一级毛片 | 99久久这里只有精品 | 久久99国产精品成人 | 日韩毛片在线看 | 久久久久久免费观看 | 天天干人人 |