首页 >> 大全

Android折叠屏开发学习(二)

2023-12-14 大全 24 作者:考证青年

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为4521字,预计阅读8分钟

前言

上一篇《折叠屏开发学习(一)---通过传感器获取铰链角度》使用了传感器获取折叠屏打开的角度。而在2021 I/O,发布了 用于进行折叠屏适配,今天这篇我们就来使用一下 来做个折叠屏的Demo

实现效果

微卡智享

是一个以 优先的现代化库,它支持不同形态的新设备,并提供 “类 ” 的功能以构建具有响应式 UI 的应用。

通过 API中来获取折叠屏的状态,其中获取的信息包含了窗口的显示特性,例如该窗口是否可折叠或包含铰链,在中可以得到,让您能够监听可折叠设备的折叠状态得以判断设备的姿态。

中几个关键的项:

其中属性对于双屏设备,当应用跨铰链时,这始终为 true;对于其他可折叠设备,仅当状态是 时(例如设备处于桌面状态时)这个为 true。所以我们可以定义同个函数在显示当前的状态。

fun isTableTopPosture(foldFeature: FoldingFeature?): Boolean {return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL}fun isBookPosture(foldFeature: FoldingFeature?): Boolean {return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&foldFeature.orientation == FoldingFeature.Orientation.VERTICAL}fun isSeparating(foldFeature: FoldingFeature?): Boolean {return foldFeature?.state == FoldingFeature.State.FLAT && foldFeature.isSeparating}

对应的状态图如下:

代码实现

微卡智享

android折叠屏_折叠屏幕原理和发展_

01

build.依赖

Demo还是接着我们的MVI的Demo,首先就是加入依赖项。

dependencies {implementation "androidx.window:window:1.0.0"implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
}

这里我用的是1.0稳定版,当前已经到了1.1.0-了,当然监听还是用到了及协程,所以也加进来,我的项目依赖项如下图

02

布局文件

创建了一个新的,其中布局文件只有一个图片()和一个文本()。


图片资源就是上图里面四个图片的状态,文件直接复制到中了。

03

代码

新建的中,创建和Flow的变量。

class WindowInfoTrackerActivity : AppCompatActivity() {private lateinit var windowInfoTracker : WindowInfoTrackerprivate lateinit var windowLayoutInfoFlow : Flow

在中初始化变量和监听

private fun observeFold() {lifecycleScope.launch(Dispatchers.Main) {lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {windowLayoutInfoFlow.collect { layoutInfo ->Log.i(TAG, "size:${layoutInfo.displayFeatures.size}")val foldingFeature = layoutInfo.displayFeatures.filterIsInstance().firstOrNull()foldingFeature?.let {Log.i(TAG, "state:${it.state}")}when {isTableTopPosture(foldingFeature) ->sendInfoMsg("横向半开")isBookPosture(foldingFeature) ->sendInfoMsg("竖向半开")isSeparating(foldingFeature) ->// Dual-screen devicefoldingFeature?.let {if (it.orientation == FoldingFeature.Orientation.HORIZONTAL) {sendInfoMsg("横向全展开")} else {sendInfoMsg("竖向全展开")}}else -> {sendInfoMsg("主屏")}}}}}}

监听就是通过获取到信息,然后提取,通过判断的当前状态.

代码中可以看到判断的状态后使用发送消息,是用协程直接给发送消息。

_折叠屏幕原理和发展_android折叠屏

使用MVI架构更新UI

《 MVI架构初探》文章中介绍了MVI的架构,本文的Demo也是在这个基础上做的,所以实现更新UI,下图中是当时我们MVI架构的示意图,我们重新看一下怎么处理的。

和增加Info项

中的处理

中接收到的消息后,直接再往State中进行推送。

中的监听

在的中开启的监听

接收到.Info后直接调用来更新UI显示

中更新显示当前的状态,并根据状态更换显示的图片。这样我们的Demo就完成了。

微卡智享

划重点

文章中可以看到,我用的虚拟机进行的测试,最主要的原因是使用获取折叠屏当前状态,在 11下完全正常,但是在 12中就不好用了,我的真机是 12就完全没反应,后来创建了一个 12的虚拟机也是如此,代码其实挺简单,但是这个问题倒是卡了我好几天,后来又下的的官方Demo也算比较旧的了,用了官方Demo试过,也是一样的,在 12下用不了。如果有知道怎么解决的朋友麻烦留言告之一下。

P2为当前程序运行的实现效果视频。下一篇将使用来实现折叠屏不同状态的不同布局效果,代码还是在这个项目中,会再增加一个实现。

源码地址

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了