Flutter插件开发之折叠屏适配

前言

1
2
3
1、最近在做 Flutter 插件开发时,需要判断是否为折叠屏。

2、折叠屏的开发主要集中在 Android 原生端的开发

1、Jetpack WindowManager

  • Jetpack WindowManager 中的 WindowInfoTracker 接口可以获取到折叠屏相关数据。
  • WindowInfoTracker 接口的 windowLayoutInfo() 方法返回一个数据流,该数据流内部包含了折叠屏的当前状态。
  • WindowManager 可以通过 Kotlin FlowJava 回调两种方案来采集数据。
  • 需要引用的包:
1
2
3
implementation "androidx.window:window:1.0.0"
implementation "androidx.window:window-java:1.0.0"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'

2、Kotlin Flow

  • 在采集数据时,可以采用 生命周期感知协程
  • 当生命周期处于 STARTED 时,执行 repeatOnLifecycle 方法。
  • 当生命周期为 STOPPED 停止执行。以下为代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private fun initFoldingFeature() {
lifecycleScope.launch(Dispatchers.Main) {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
WindowInfoTracker.getOrCreate(this@MainActivity)
.windowLayoutInfo(this@MainActivity)
.collect { data ->
val feature = data.displayFeatures
.filterIsInstance<FoldingFeature>()
.firstOrNull()
LogUtils.i("-------- data: $data, feature: $feature")
when {
isHalfOpen(feature) -> sendToFlutter("屏幕半开")
isFlat(feature) -> sendToFlutter("完全打开")
else -> sendToFlutter("主屏显示")
}
}
}
}
}

private fun sendToFlutter(state: String) {
textView.text = state
}

private fun isHalfOpen(feature: FoldingFeature?): Boolean {
return feature?.state == FoldingFeature.State.HALF_OPENED
}

private fun isFlat(feature: FoldingFeature?): Boolean {
return feature?.state == FoldingFeature.State.FLAT
}

3、Java 回调

  • Java 回调必须要引入 androidx.window:window-java 包。
  • 通过 WindowInfoTrackerCallbackAdapter 来注册和注销相关回调
  • 以下为代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  private lateinit var windowTrack: WindowInfoTrackerCallbackAdapter
private val callback = LayoutStateChangeCallback()

private fun initTrackAdapter() {
windowTrack = WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(this))
}

override fun onStart() {
super.onStart()
windowTrack.addWindowLayoutInfoListener(this, Runnable::run, callback)
}

override fun onStop() {
super.onStop()
LogUtils.i("onStop.. ")
windowTrack.removeWindowLayoutInfoListener(callback)
}

class LayoutStateChangeCallback : Consumer<WindowLayoutInfo> {
override fun accept(info: WindowLayoutInfo) {
LogUtils.i("accept.. info: $info")
}
}

4、RxJava 支持

  • RxJavaKotlin Flow 类似,这里不再做介绍了。

5、参考资料:



Flutter插件开发之折叠屏适配
http://jxr202.github.io/flutter/flutter_003-e48d3580c80d/
作者
Jiang
发布于
2022年12月1日
许可协议