Android可折叠设备完全指南:展开未来

news2025/1/16 8:45:30

Android可折叠设备完全指南:展开未来

探索如何使用Android Jetpack组件折叠和展开设备。
近年来,科技界见证了可折叠设备的革命性趋势。这些设备融合了便携性和功能性的创新特点,使用户能够在不同的形态之间无缝切换。在本博客中,我们将深入探讨Android可折叠设备的世界,探索它们独特的特点、设计考虑因素,以及开发人员如何为这些设备创建优化的应用程序。

可折叠设备的兴起

预计2023年可折叠手机出货量将达到2140万台,比2022年的1420万台增长50%。到2027年,这个数字将超过4810万台,年复合增长率为27.6%。尽管增长迅速,可折叠智能手机仍属于高端市场,平均售价预计在2023年下降6.8%。各公司正在投资软硬件改进,推动持续采用。

可折叠设备与传统智能手机和平板电脑完全不同。它们具有可以折叠和展开的柔性屏幕,可以实现多种使用场景。随着Android生态系统的扩展以支持这些设备,开发人员面临着激动人心的新挑战和机遇。


为可折叠设备进行设计

设计可折叠设备需要重新构思用户界面。随着设备的折叠和展开,应用程序需要优雅地适应不同的屏幕尺寸和方向。为了实现这一点,开发人员必须利用Android内置的可折叠和多窗口环境支持。

关键设计考虑因素

  1. 多窗口支持:Android允许应用程序在多个窗口中同时运行。开发人员必须确保他们的应用程序可以在分屏和自由形式模式下有效使用。您可以查阅并遵循官方指南以支持此功能。

https://source.android.com/docs/core/display/multi_display/multi-resume

  1. 自适应布局:采用ConstraintLayout和其他布局管理工具可以帮助创建动态界面,根据不同的屏幕尺寸和方向进行调整。您可以按照这些开发人员指南来调整布局。

  1. Flex Mode: 可折叠设备通常支持“弯折模式”,屏幕部分折叠。应用程序应该针对此模式进行优化,使其布局适应可用的屏幕空间。

  2. 连续性:用户在从一个形态转换到另一个形态时应该体验到无缝的连续性。在这些转换过程中,数据和状态应该得到保留。要了解更多关于管理应用程序状态和连续性的信息,请参阅保存UI状态。

可折叠设备的开发策略

开发人员必须了解为可折叠设备引入的新功能和API,以创建充分利用其功能的应用程序。

  1. 多重恢复:可折叠设备允许多个应用程序在分屏模式下同时活动。开发人员应该按照这些指南确保他们的应用程序正确处理多重恢复的情况。

https://source.android.com/docs/core/display/multi_display/multi-resume

  1. 窗口管理:Android提供了用于管理多个窗口的API,包括调整大小、定位和焦点设置。开发人员应该熟悉这些API,以获得最佳的应用程序行为。

https://developer.android.com/topic/arc/window-management

  1. 显示切口和凹口:可折叠设备可能具有独特的屏幕配置。开发人员应该调整他们的用户界面,以适应显示切口和凹口。

优化现有应用程序

为可折叠设备调整现有应用程序涉及设计、布局和编码的调整。优先考虑核心功能,并在如何充分利用可折叠设备功能方面做出战略决策。

拥抱移动计算的未来

随着可折叠设备的普及,开发人员有机会塑造移动计算的未来。通过了解这些设备提供的独特挑战和可能性,开发人员可以创建出提供用户无与伦比的灵活性和功能性的应用程序。

以下是一个示例,演示如何在包含常用列表视图和详细视图屏幕的单个活动中处理可折叠和非可折叠设备:

Jetpack WindowManager库帮助应用程序开发人员支持新的设备形态,并在旧版和新版平台上提供各种WindowManager功能的公共API。将以下内容添加到您的app/build.gradle文件中。此设置增强了Android应用程序中的窗口管理和生命周期处理。

(Jetpack WindowManager)
https://developer.android.com/jetpack/androidx/releases/window

dependencies {
   
   //need to get updates from window manager about layouts and screen
   implementation('androidx.window:window-java:1.2.0')
   implementation('androidx.window:window-rxjava2:1.2.0')

   // need to use it for lifecycleScope to collect windowLayoutInfo
   implementation('androidx.lifecycle:lifecycle-runtime-ktx:2.6.2')
   
}

您可以在lifecycleScope中观察WindowInfoTracker,并相应地更新您的用户界面。

//MainActivity.kt
lifecycleScope.launch(Dispatchers.Main) {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                WindowInfoTracker.getOrCreate(this@MainActivity)
                    .windowLayoutInfo(this@MainActivity)
                    .collect { updateUI(it) }
            }
 }

在这里,我们从WindowLayoutInfo中获取displayFeatures,并相应地展开或折叠。

//MainActivity.kt
  private fun updateUI(windowLayoutInfo: WindowLayoutInfo) {
        val displayFeature = windowLayoutInfo.displayFeatures
        var isUnFold = false
        for (feature in displayFeature) {
            if (feature is FoldingFeature) {
                val foldPos = feature.bounds.right
                val foldWidth = feature.bounds.left - foldPos
                expandLayout(foldPos, foldWidth)
                isUnFold = true
            }
        }
        if (!isUnFold) collapseLayout()
    }

在这个方法中,我们通过折叠点的帮助启用了详细的屏幕布局。

//MainActivity.kt
private fun expandLayout(guidelinePosition: Int, foldWidth: Int) {
        val listViewFragmentId = R.id.listViewFragmentContainer
        val detailViewFragmentId = R.id.listViewDetailFragmentContainer
        val landscapeLayout = ConstraintSet()
        landscapeLayout.apply {
            clone(binding.constraintLayout)
            setMargin(detailViewFragmentId, ConstraintSet.START, foldWidth)
            applyTo(binding.constraintLayout)
        }
        binding.guideline.setGuidelineEnd(guidelinePosition)
        listViewFragment.setDetailViewContainerId(detailViewFragmentId)
        fragmentManager.beginTransaction()
            .replace(listViewFragmentId, listViewFragment)
            .replace(detailViewFragmentId, detailViewFragment)
            .commit()
    }

这个方法将设置初始布局,并为列表屏幕布局设置用户界面。

//MainActivity.kt
private fun collapseLayout() {
        val listViewFragmentId = R.id.listViewFragmentContainer
        binding.guideline.setGuidelineEnd(0)
        binding.listViewDetailFragmentContainer.visibility = View.GONE
        listViewFragment.setDetailViewContainerId(listViewFragmentId)
        fragmentManager.beginTransaction().replace(listViewFragmentId, listViewFragment).commit()
}

输出

当我们没有添加WindowInfoTracker并且设备展开时的列表屏幕:

这是当我们添加了WindowInfoTracker并且设备展开时的列表屏幕。它将同时显示详细屏幕:

结论

Android对可折叠设备的支持得到了改善,专注于响应式设计。这使得应用程序能够适应不同的显示尺寸,给开发人员带来了挑战和机会。Android提供了创建响应式布局的资源。

参考

https://developer.android.com/guide/topics/large-screens/multi-window-support
https://developer.android.com/guide/topics/resources/runtime-changes
https://developer.android.com/topic/libraries/architecture/saving-states

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub、Gitee、Gitlab共用一个SSH密钥配置

目录 1. 说明2. 生成ssh2-1. 设置全局邮箱和用户名2-2. 生成全局ssh 3. Github、Gitee配置ssh3-1. Github配置3-2. Gitee配置 1. 说明 由于我的Github、Gitee、Gitlab用的邮箱不同,向不同的平台提交代码时都需要验证密码,非常麻烦所以配置了一个共用的S…

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构,其中基本的矩阵乘法运算被卷积运算取代,专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC,是Visual studio code的缩写,是由微软开发的跨平台的轻量级编辑器,支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…

【SPI和API有什么区别】

✅什么是SPI,和API有什么区别 ✅典型解析🟢拓展知识仓🟢如何定义一个SPI🟢SPI的实现原理 ✅SPI的应用场景SpringDubbo ✅典型解析 Java 中区分 API和 SPI,通俗的进: API和 SPI 都是相对的概念,他们的差别只…

九:爬虫-MongoDB基础

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其…

Pytest测试中的临时目录与文件管理!

在Pytest测试框架中,使用临时目录与文件是一种有效的测试管理方式,它能够确保测试的独立性和可重复性。在本文中,我们将深入探讨如何在Pytest中利用临时目录与文件进行测试,并通过案例演示实际应用。 为什么需要临时目录与文件&am…

安卓CA证书安装导入失败在设置中安装CA证书

环境:一般手机涉及到TLS解密及逆向等必备操作是需要类似抓包一类的应用,要想获取到指定应用的完整解密数据包则至少需要Root或配合授权的CA 证书简单来说就是需要进行解密授权 CA证书的通用格式一般有 点击直达 根证书(PEM 格式&#xff09…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结:在数据量小和模型参数少,batch_size小时,cpu训练更快(原因:每次训练时数据需要放入GPU中,由于batch_size小。数据放入gpu比模型计算时间还长) 在…

力扣(leetcode)1148和1179题(MySQL)

1148.文章浏览I 题目链接:1148.文章浏览I 解答 # Write your MySQL query statement below select distinct author_id as id from Views where author_idviewer_id order by id;1179.重新格式化部门表 题目链接:1179.重新格式化部门表 解答 …

【prompt一】Domain Adaptation via Prompt Learning

1.Motivation 当前的UDA方法通过对齐源和目标特征空间来学习域不变特征。这种对齐是由诸如统计差异最小化或对抗性训练等约束施加的。然而,这些约束可能导致语义特征结构的扭曲和类可辨别性的丧失。 在本文中,引入了一种新的UDA提示学习范式&#xff0…

yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。‘yarn‘ 不是内部或外部命令,也不是可运行的程序.解决方案

文章目录 报错截图介绍方法一方法二评论截图 报错截图 介绍 我的npm已经安装好了, 是可以运行npm -v 来查看版本的 这个时候报 yarn 不是内部或外部命令 相信你的npm也已经安装好了 我下面两个方法都进行了, 具体起作用的我也不知道是哪个, 都试试吧, 我成功了 注意尝试后关…

仅操作一台设备,如何实现本地访问另一个相同网段的私网?

正文共:1034 字 8 图,预估阅读时间:4 分钟 书接上文(地址重叠时,用户如何通过NAT访问对端IP网络?),我们已经通过两台设备的组合配置实现了通过IP地址进行访问。但一般场景中&#xf…

2023年智能算法之双曲正弦余弦优化器(SCHO),原理公式详解,附matlab代码

双曲正弦余弦优化器(Sinh Cosh Optimizer,SCHO)是一种新型元启发式算法,该算法基于双曲正弦和双曲余弦特性的数学启发,具有进化能力强、搜索速度快、寻优能力强的特点。该成果于2023年10月发表在SCI一区,To…

华为vrrp+mstp+ospf+dhcp+dhcp relay配置案例

1、左边是vlan 10主桥,右边是vlan 20的主桥,并且互为备桥 2、 vlan 10 vrrp网关默认用左边,vlan 20的vrrp 网关默认用右边,对应mstp生成树 3、两边都track检测,不通就把vrrp减掉60,这样就会自动切另一边了 …

在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN 最早源自 Ian Goodfellow 的这篇论文。LeCun 对 GAN 给出了极高的评价: “There are many interesting recent development in deep learning…The most important one, in my opinion, is adv…

华为设备文件系统基础

华为网络设备的配置文件和VRP系统文件都保存在物理存储介质中,所以文件系统是VRP正常运行的基础。只有掌握了对文件系统的基本操作,网络工程师才能对设备的配置文件和VRP系统文件进行高效的管理。 基本查询命令 VRP基于文件系统来管理设备上的文件和目录…

NTFS权限与文件系统:深入解析与实践指南

在当今的信息时代,数据安全和管理成为了每个组织和个人的重要议题。NTFS权限作为Windows操作系统中的一个核心功能,为文件和文件夹的安全管理提供了强大的支持。本文将深入解析NTFS权限的基本概念,并通过实际操作指导如何有效地利用这些权限来…

HTML5文档

目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…

R语言ggplot2可视化:分组堆叠条形图,展示不同分组的多个处理数据特征,动态交互式条形图

在实验数据可视化过程中,经常需要对多个样本在多个处理条件下多种指标进行比较,使用下面这种分组堆叠条形图能从多个角度同时展示数据特征。 备注:图中横轴以“0”为界左右分为两部分,可以用来表示处理A和处理B,纵轴表…

AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82

篇头 最近写文章,反复多次折腾AOSP代码,因通过网络repo sync aosp代码,能一次顺利下载的概率很低,以前就经常遇到,但从未总结,导致自己也要回头检索方法,所以觉得可以总结一下,涉及…