免费特黄视频_国产精品久久久av_久久香蕉网_国产精彩视频_中文二区_国产成人一区

二維碼
企資網

掃一掃關注

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

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

放大字體  縮小字體 發布日期:2021-09-23 00:45:14    作者:大連旅游小寶哥    瀏覽次數:1
導讀

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

為可折疊設備和大屏設備優化您的應用

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

新的 WindowManager API 包含了以下內容:

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

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

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

    關于 Jetpack WindowManager

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

    折疊狀態

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

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

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

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

    △ 折疊狀態: FLAT 和 HALF-OPENED

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

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

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

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

    FoldingFeature 包括了諸如鉸鏈 方向,及折疊功能是否創建了兩個邏輯屏幕區域 (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

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

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

    支持響應式 UI

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

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

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

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

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

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

    這個例子是關于如何根據可用區域來切換您的布局:

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

    回調適配器

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

    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);       }   }}

    測試

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

    現在,我們已經知道 Jetpack WindowManager 庫可以在設備姿態改變時,向您的應用發送通知,以便您修改應用的布局。

    該庫在 androidx.window:window-testing 中提供了 WindowLayoutInfoPublisherRule 讓您能夠發布一個 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 來發布它:

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

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

    下面這個測試中發布了一個處于 HALF_OPENED 狀態并且鉸鏈垂直于屏幕中心的 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 注冊回調來獲取顯示姿態信息。

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

    在您的應用中使用 WindowManager

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

    我們去年推出了 Jetpack WindowManager alpha01 版本。該庫自那時起開始穩步地發展,早期的反饋讓其有了很大的改進?,F在,它已經擁抱了 Android 的 Kotlin 優先理念,從回調驅動模型逐漸過渡到協程和數據流。隨著 WindowManager 進入測試階段,API 已經穩定,我們強烈建議使用它。

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

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

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

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

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

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

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

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 自拍偷拍欧美 | 亚洲免费视频一区 | 一色桃子av | 欧美国产日韩在线 | 欧美成视频 | 日日干av | 日本在线看片 | 国产女人高潮毛片 | 日韩高清一区二区 | 久久综合久久鬼 | a天堂在线观看 | 一区二区三区久久久 | 国产福利在线视频 | 中文在线观看免费高清 | 伊人久久网站 | 国产一级片 | 亚洲激情中文字幕 | 亚洲精选在线观看 | 一级黄色片视频 | 成人在线免费观看网站 | 亚洲综合激情网 | 蜜臀久久99精品久久久久久宅男 | av黄| 日韩亚洲在线 | 亚洲国产中文字幕 | 久草福利在线 | 色激情网| 夜夜操夜夜 | 中国农村毛片免费播放 | 欧美色影院 | 免费成人小视频 | 人人干人人草 | 久久久久免费视频 | www.夜夜操| 91在线一区二区 | 国产区免费 | 一区二区视频在线播放 | 国产精品一级 | 日韩大片在线观看 | 久久久精品一区 | 欧美精品99|