Android使用Jetpack WindowManager開發(fā)可折疊設(shè)備(過程分享)
一、背景
我們在Google開發(fā)者大會上,看到Jetpack WindowManager和WindowSizeClass這些技術(shù),如下圖。
那這里不得不說折疊屏手機(jī)了
- 在其中一個顯示區(qū)域中運行一個應(yīng)用。
- 同時運行兩個應(yīng)用,各位于一個顯示區(qū)域中(在
multi-window
模式下)。 - 可折疊設(shè)備還支持不同的折疊狀態(tài)。折疊狀態(tài)可用來以不同的方式顯示內(nèi)容
折疊屏手機(jī)有哪些優(yōu)勢呢?
- 更大的屏幕空間
- 更高的靈活性
- 更好的移動性
- 更高的科技含量
隨著人們對生活品質(zhì)的越來越高,單屏幕手機(jī)已經(jīng)難以滿足部分需求,折疊屏手機(jī)也越來越受歡迎,能給用戶帶來與眾不同的體驗,Jetpack WindowManager和WindowSizeClass就是折疊屏手機(jī)開發(fā)所需要的技術(shù),有了這些技術(shù),可以幫我們更好的開發(fā)折疊屏。
二、Jetpack WindowManager的簡單了解
WindowManager的功能,包括對響應(yīng)式UI的支持、檢測屏幕變化的回調(diào)適配器以及窗口測試API。但Jetpack WindowManager還提供了對新型設(shè)備的支持,如可折疊設(shè)備和Chrome OS等窗口環(huán)境,是一個現(xiàn)代的、以Kotlin為首的庫,它支持新的設(shè)備形態(tài)因素,并提供 "類似AppCompat "的功能,以構(gòu)建具有響應(yīng)式用戶界面的應(yīng)用程序。
主要的API
新的WindowManager APIs包括以下內(nèi)容。
WindowLayoutInfo:包含了一個窗口的顯示特征,例如窗口是否包含了折疊或鉸鏈
FoldingFeature:使你能夠監(jiān)測可折疊設(shè)備的折疊狀態(tài),以確定設(shè)備的姿勢
WindowMetrics:提供當(dāng)前窗口的指標(biāo)或整體顯示的指標(biāo)
Jetpack WindowManager與安卓系統(tǒng)沒有捆綁,允許更快地迭代API,以支持快速發(fā)展的設(shè)備市場,并使應(yīng)用程序開發(fā)人員能夠采用庫的更新,而不必等待最新的安卓版本。
三、Jetpack WindowManager的簡單使用
首先我們需要到官網(wǎng)先下載好Android studio,把開發(fā)環(huán)境搞好。
1)、創(chuàng)建一個新項目
加入部分依賴
dependencies { ext.windowmanager_version = "1.0.0" implementation "androidx.window:window:$windowmanager_version" androidTestImplementation "androidx.window:window-testing:$windowmanager_version" // Needed to use lifecycleScope to collect the WindowLayoutInfo flow implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0" }
2)、使用 WindowManager
通過 WindowManager 的 WindowInfoTracker 接口訪問窗口功能。
打開 MainActivity.kt 源文件并調(diào)用 WindowInfoTracker.getOrCreate(this@MainActivity),以初始化與當(dāng)前 activity 相關(guān)聯(lián)的 WindowInfoTracker 實例:
import androidx.window.layout.WindowInfoTracker private lateinit var windowInfoTracker: WindowInfoTracker override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) windowInfoTracker = WindowInfoTracker.getOrCreate(this@MainActivity) }
3)、設(shè)置應(yīng)用界面
通過 Jetpack WindowManager,我們能夠獲取窗口指標(biāo)、布局和顯示配置的相關(guān)信息。讓我們在主 activity 布局中顯示這些信息(針對每項信息分別使用一個 TextView)。
為此,我們需要一個 ConstraintLayout,其中包含三個 TextView,并在屏幕上居中。
打開 activity_main.xml 文件,然后粘貼以下內(nèi)容:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/constraint_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/window_metrics" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" tools:text="Window metrics" android:textSize="20sp" app:layout_constraintBottom_toTopOf="@+id/layout_change" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" /> <TextView android:id="@+id/layout_change" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" tools:text="Layout change" android:textSize="20sp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@+id/configuration_changed" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/window_metrics" /> <TextView android:id="@+id/configuration_changed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" tools:text="Using one logic/physical display - unspanned" android:textSize="20sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/layout_change" /> </androidx.constraintlayout.widget.ConstraintLayout>
4)、直觀呈現(xiàn) WindowMetrics 信息
在 MainActivity 的 onCreate 方法中,我們將調(diào)用一個將在后續(xù)步驟中實現(xiàn)的函數(shù)。該函數(shù)將用于獲取和顯示 WindowMetrics 信息。首先,在 onCreate 方法中添加 obtainWindowMetrics() 調(diào)用:
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) windowInfoTracker = WindowInfoTracker.getOrCreate(this@MainActivity) obtainWindowMetrics() }
obtainWindowMetrics 方法:
import androidx.window.layout.WindowMetricsCalculator private fun obtainWindowMetrics() { val wmc = WindowMetricsCalculator.getOrCreate() val currentWM = wmc.computeCurrentWindowMetrics(this).bounds.flattenToString() val maximumWM = wmc.computeMaximumWindowMetrics(this).bounds.flattenToString() binding.windowMetrics.text = "CurrentWindowMetrics: ${currentWM}\nMaximumWindowMetrics: ${maximumWM}" }
運行該應(yīng)用。根據(jù)您使用的可折疊設(shè)備,將得到不同的結(jié)果。例如,在雙屏設(shè)備模擬器中(如下圖所示),您會得到與模擬器所鏡像的設(shè)備尺寸對應(yīng)的 CurrentWindowMetrics。還可以查看應(yīng)用在單屏模式下運行時的指標(biāo):
當(dāng)應(yīng)用跨顯示屏顯示時,窗口指標(biāo)會發(fā)生變化(如下圖所示),因此它們現(xiàn)在反映的應(yīng)用所用窗口區(qū)域比之前大:
由于該應(yīng)用在單屏和雙屏設(shè)備上始終運行并占滿整個顯示區(qū)域,因此當(dāng)前窗口指標(biāo)和最大窗口指標(biāo)的值相同。
在有水平折疊邊的可折疊設(shè)備模擬器中,這些值在應(yīng)用跨整個物理顯示屏運行時和在多窗口模式下運行時會有所不同:
5)、使用 Jetpack WindowManager 進(jìn)行測試
在任何模擬器或設(shè)備上測試可折疊設(shè)備的折疊狀態(tài),對于測試如何將界面元素放置在 FoldingFeature 周圍是非常有用的。WindowManger 附帶了一個非常實用的工件,以用于進(jìn)行插樁測試。我們來看看該工件的使用方式。應(yīng)用 build.gradle 文件中,我們不僅添加了主 WindowManager 依賴項,還添加了測試工件:androidx.window:window-testing
window-testing 工件附帶有一個名為 WindowLayoutInfoPublisherRule 的實用的新 TestRule,它可以幫助您使用一系列 WindowLayoutInfo 值進(jìn)行測試。借助 WindowLayoutInfoPublisherRule,您可以按需推送不同的 WindowLayoutInfo 值。
為了使用它,并在此基礎(chǔ)上創(chuàng)建一個示例以幫助您使用此新工件來測試界面,我們將更新由 Android Studio 模板創(chuàng)建的測試類。將 ExampleInstrumentedTest 類中的所有代碼替換為以下代碼:
import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.window.testing.layout.WindowLayoutInfoPublisherRule import org.junit.Rule import org.junit.rules.RuleChain import org.junit.rules.TestRule import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class MainActivityTest { private val activityRule = ActivityScenarioRule(MainActivity::class.java) private val publisherRule = WindowLayoutInfoPublisherRule() @get:Rule val testRule: TestRule init { testRule = RuleChain.outerRule(publisherRule).around(activityRule) } }
我們來創(chuàng)建一項測試,用于檢查相應(yīng)實現(xiàn)是否正確無誤。創(chuàng)建一項名為 testText_is_left_of_Vertical_FoldingFeature 的測試:
@Test fun testText_is_left_of_Vertical_FoldingFeature() { activityRule.scenario.onActivity { activity -> val hinge = FoldingFeature( activity = activity, state = FoldingFeature.State.FLAT, orientation = FoldingFeature.Orientation.VERTICAL, size = 2 ) val expected = TestWindowLayoutInfo(listOf(hinge)) publisherRule.overrideWindowLayoutInfo(expected) } onView(withId(R.id.layout_change)).check( PositionAssertions.isCompletelyLeftOf(withId(R.id.folding_feature)) ) }
我們可以在設(shè)備或模擬器上運行測試,以檢查應(yīng)用的行為是否符合預(yù)期。這個測試無需使用可折疊設(shè)備或模擬器即可運行。
四、總結(jié)
可折疊和雙屏設(shè)備不再是實驗性的或未來主義的--大的顯示區(qū)域和額外的姿勢具有被證實的用戶價值,而且現(xiàn)在有更多的設(shè)備可以供你的用戶使用。可折疊設(shè)備和雙屏設(shè)備代表了智能手機(jī)的自然進(jìn)化。對于安卓開發(fā)者來說,他們提供了進(jìn)入一個正在增長的高端市場的機(jī)會,這也得益于設(shè)備制造商的重新關(guān)注,而我們使用Jetpack WindowManager和WindowSizeClass來促進(jìn)可折疊手機(jī)的發(fā)展,Google帶來的開發(fā)工具真的越來越高效便捷。
到此這篇關(guān)于Android使用Jetpack WindowManager來開發(fā)可折疊設(shè)備的探索的文章就介紹到這了,更多相關(guān)Android使用Jetpack WindowManager內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
webview添加參數(shù)與修改請求頭的user-agent實例
這篇文章主要介紹了webview添加參數(shù)與修改請求頭的user-agent實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android?Studio中如何修改APP圖標(biāo)和APP名稱
這篇文章主要介紹了Android?Studio中如何修改APP圖標(biāo)和APP名稱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11Android開發(fā)之StackView用法和遇到的坑分析
這篇文章主要介紹了Android開發(fā)之StackView用法和遇到的坑,結(jié)合實例形式分析了Android StackView圖片操作用法及常見問題解決方法,需要的朋友可以參考下2019-03-03Android切換至SurfaceView時閃屏(黑屏閃一下)以及黑屏移動問題的解決方法
本文主要介紹了Android切換至SurfaceView時閃屏(黑屏閃一下)以及黑屏移動問題的解決方法。具有一定的參考作用,下面跟著小編一起來看下吧2017-01-01詳解Android創(chuàng)建Handler的必備知識點
本篇文章主要介紹Handler中需要了解的幾個必備知識點,比如Handler創(chuàng)建、異步Handler是個啥及如何創(chuàng)建,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下2022-10-10android的RecyclerView實現(xiàn)拖拽排序和側(cè)滑刪除示例
在平時開發(fā)應(yīng)用的時候,經(jīng)常會遇到列表排序、滑動刪除的需求。這篇文章主要介紹了android的RecyclerView實現(xiàn)拖拽排序和側(cè)滑刪除示例,有興趣的可以了解一下。2017-02-02