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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

照片墙案例

整体效果&#xff1a; HTML部分&#xff1a; <body><div class"content"><header><h1>A silent world</h1><span>Image Wall with jQuery and CSS3</span></header><div class"iw_wrapper"><ul…

3D数字化系统建设

以3D可视化、数字化技术为基础&#xff0c;其实&#xff0c;很多传统的系统软件都可以重新做一下。 比如&#xff1a;以下这个使用场景&#xff1a;零售门店陈列&#xff1b; 还有&#xff0c;数字化仓储系统&#xff0c;3D数字化供应链系统&#xff0c;3D数字化的生产系统&a…

.NET中的Swagger使用

目录 前言 一、Swagger是什么&#xff1f; 二、如何Swagger文档说明的信息 1.在AddSwaggerGen方法中写入文档信息 2.运行效果 二、文档UI界面标题、路由设置 1.在中间件UseSwaggerUI方法中配置 三、文档UI界面添加接口注释 1.在 .csproj中配置 2.在AddSwaggerGen方法中配置Incl…

MFC 菜单

目录 MFC菜单 菜单使用 添加菜单资源 将菜单设置到窗口 ON_COMMAND消息处理 命令消息 WM_COMMAND 的处理顺序 设置菜单项状态 右键菜单 MFC菜单 在Win32编程中&#xff0c;使用菜单句柄 HMENU 来标识菜单&#xff0c;在MFC中使用CMenu类对象表示菜单。封装了关于菜单的…

MATLAB - 四元数(quaternion)

系列文章目录 前言 一、简介 四元数是一种四元超复数&#xff0c;用于三维旋转和定向。 四元数的表示形式为 abicjdk&#xff0c;其中 a、b、c 和 d 为实数&#xff0c;i、j 和 k 为基元&#xff0c;满足等式&#xff1a;i2 j2 k2 ijk -1。 四元数集用 H 表示&#xff0c…

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像2、安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像 官方提供使用通道 访问官网 链接: https://www.kylinos.cn/ 下…

【Python】基于flaskMVT架构与session实现博客前台登录登出功能

目录 一、MVT说明 1.Model层 2.View层 3.Template层 二、功能说明 三、代码框架展示 四、具体代码实现 models.py 登录界面前端代码 博客界面前端代码&#xff08;profile.html&#xff09; main.py 一、MVT说明 MVT架构是Model-View-Template的缩写&#xff0c;是…

VS(Visual Studio)更改文件编码

vs默认编码是GB2312,更改为UTF-8 工具->自定义

Tomcat与Netty比较

Tomcat介绍Tomcat支持的协议Tomcat的优缺点Netty介绍Netty支持的协议Netty的优点和缺点Tomcat和Netty的区别Tomcat和Netty的应用场Tomcat和Netty来处理大规模并发连接的优化Tomcat与Netty的网络模型的区别Tomcat与Netty架构设计拓展 Tomcat介绍 Tomcat是一个免费的、开放源代码…

nodejs+vue+ElementUi摄影作品图片分享工作室管理系统

第1周 2.21&#xff5e;2.27 查阅资料&#xff0c;学习vscode开发平台和vue框架技术 第2周 2.28&#xff5e;3.6 对软件功能需求进行分析, 软件功能模块划分及软件界面设计 第3周 3.7&#xff5e;3.13 撰写并提交毕业设计开题报告、英文资料翻译 第4周 3.14&#xff5…

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…

【docker笔记】docker理论及安装

前言 本笔记来源于尚硅谷docker教学视频 视频地址&#xff1a;https://www.bilibili.com/video/BV1gr4y1U7CY/?spm_id_from333.337.search-card.all.click 纯手打笔记&#xff0c;来之不易&#xff0c;感谢支持~ Docker简介 docker为什么会出现 想象一下&#xff1a;一个应用…

Web前端-JavaScript(Dom基础)

文章目录 1.1 DOM 介绍1.1.1 DOM简介1.1.2 DOM树 1.2. 获取元素1.2.1 根据ID获取元素1.2.2 根据标签名获取元素1.2.3 其它方式获取元素1.2.4 获取特殊元素 1.3 事件基础1.3.1 事件概述1.3.2 事件三要素1.3.3 执行事件步骤1.3.4 鼠标事件 1.4 操作元素1.4.1 操作元素内容1.4.2 属…

Java小案例-MusiQ音乐网站

目录 前言 项目功能 技术栈 后端 前端 开发环境 项目展示 前台-首页-展示 前台-首页-代码 前台-歌单-展示 前台-歌单-代码 前台-歌手-展示 前台-歌手-代码 前台-其他页面展示 后台-登录-展示 后台-登录-代码 后台-首页-展示 首台-首页-代码 后台-其他页面-展…

PyQt6 QColorDialog颜色对话框控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

基于Qt之QChart 图表(优美的曲线图案例)

## 项目演示 平台:ubuntu18.04 Qt版本:QT5.14.2 源码位置GitCode:https://gitcode.com/m0_45463480/QCharts/tree/main ## QChart 图表 自从 Qt 发布以来,给跨平台的用户带来很多便利。在 Qt5.7 之前,Qt 在开源社区版本里没有 Qt Charts(自带的绘图组件库)。这使得像…

SpringBoot的日志管理

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

Kubernetes api-server源码阅读2(Debug Kubernetes篇)

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes api-server源码阅读 系列第二篇&#xff0c;主要讲述如何实现 kubernetes api-server 的 debug 参考b站视频地址&#xff1a;Kubernetes源码开发之旅二 1.本篇章任务 Go-Delve&#xff1a;go语言的…

INFINI Gateway 如何防止大跨度查询

背景 业务每天生成一个日期后缀的索引&#xff0c;写入当日数据。 业务查询有时会查询好多天的数据&#xff0c;导致负载告警。 现在想对查询进行限制–只允许查询一天的数据&#xff08;不限定是哪天&#xff09;&#xff0c;如果想查询多天的数据就走申请。 技术分析 在每…

排序算法——桶排序

把数据放进若干个桶&#xff0c;然后在桶里用其他排序&#xff0c;近乎分治思想。从数值的低位到高位依次排序&#xff0c;有几位就排序几次。例如二位数就排两次&#xff0c;三位数就排三次&#xff0c;依次按照个十百...的顺序来排序。 第一次排序&#xff1a;50 12 …