针对大屏设备优化 Android 应用的方式及相关注意事项

news2024/11/25 2:31:33

d1bafe02b826fd26b8a6c8e0fabf4a8a.png

作者 / Android 团队

近年来,包括大型可折叠设备、平板电脑以及 Chromebook 等大屏 Android 设备的数量与日俱增。确保应用可以在大屏设备上为用户提供无缝体验比以往任何时候都更加重要。例如,用户希望应用能够更充分利用这些设备的更大屏幕空间。我们发现,如果应用能够支持大屏设备,便可以在这些设备上实现更出色的业务指标。

  • 在这些设备上实现更出色的业务指标
    https://developer.android.google.cn/large-screens/stories

这些设备还可以在不同地方以及不同的方式来使用,而不是通常预想的手机形式。例如,可折叠设备可在桌面模式下使用,用户可能离桌面显示器有一定距离,并且可以搭配鼠标和键盘来使用大屏设备。

但伴随着这些新变化,也出现了一些需要我们注意的新问题。例如:

  • 当用户在平板电脑上使用应用时,是否可以通过双手来便捷的触到最重要的控件?

  • 用户能否通过键盘和鼠标使用应用的各项功能?

  • 无论设备如何放置,应用相机预览的方向能否与设备屏幕方向一致?

d1ad3f456aa62193bae7e02cf2008330.png

cbf7868bbd8c2a9e2f23157ede6e261d.png

大屏应用设计和应用质量

定义什么是出色的大屏应用设计和应用质量可能很难,因为不同的应用可能会在不同的方面拥有卓越表现。您最了解自己的产品,因此请在大屏设备上亲自使用您的应用并思考如何提供最佳体验。如果您无法使用大屏设备,可以尝试在可折叠设备、桌面设备或平板电脑的虚拟设备中选择其一。

  • 虚拟设备
    https://developer.android.google.cn/studio/run/managing-avds

Google 在您的整个开发过程中提供资源,有助于您优化应用。如果您正在寻找设计指南,可以参阅我们精心编制的《大屏设备 Material Design 指南》等设计资源,以及可直接使用的组合布局 (如规范化布局等)。您还可以从大屏设备图库中汲取灵感,该图库提供许多不同应用的优秀示例。如果您希望通过结构化方式提高大屏应用的质量,可以参阅《大屏应用质量指南》。该指南提供直观的核对清单和一系列测试,可帮助您的应用在大屏设备上获得精彩表现。

  • 大屏设备 Material Design 指南
    https://material.io/blog/material-design-for-large-screens

  • 规范化布局
    https://m3.material.io/foundations/layout/canonical-layouts/overview

  • 大屏设备图库
    https://developer.android.google.cn/large-screens/gallery

  • 大屏应用质量指南
    https://developer.android.google.cn/docs/quality-guidelines/large-screen-app-quality

1ba65391aa637699e5a05fac7dcd1dc4.png

针对大屏设备进行优化

的注意事项

无论您是否已经开发出了精美的大屏应用,我们都希望重点介绍一些实用建议,以及在针对大屏设备优化应用时要避免的常见错误。

🙅 错误做法: 设应用享有对资源的专属访问权限

  • 不要假设您的应用享有对相机等硬件资源的专属访问权限。通常情况下,大屏设备上会有多款应用同时处于活跃状态,其他应用也可能会尝试访问相同的资源。

  • 因此,您应该测试您的应用与其他应用一起工作时的表现。永远不要假设某一资源在任意给定时间均可使用。

  • 对相机等硬件资源的专属访问权限
    https://developer.android.google.cn/training/camera2/camera-preview#exclusive_resources

🙆 正确做法: 妥善处理硬件访问权限

  • 在尝试使用相机等硬件资源之前,您需要先检查此类资源。请记住,硬件外设可以随时通过 USB 添加和移除

  • 如果应用在运行时无法访问给定资源,可以妥善处理失败的情况

try {
      // Attempt to use the camera
        ...
    } catch (e: CameraAccessException) {
      e.message?.let { Log.e(TAG, it) }
      // Fail gracefully if the camera isn't currently available
    }
}

🙆 正确做法: 对生命周期事件做出恰当的响应 

  • 在 onPause() 期间,应用可能仍然对用户可见,特别是当屏幕上有多款应用更是如此。因此,在调用 onStop() 之前,您需要保持媒体播放和界面处于活跃状态。

🙅 错误做法onPause() 期间停止应用界面

override fun onPause() {
        //DON'T clean up resources here. 
        //Your app can still be visible.
        super.onPause()
    }

🙅 错误做法: 依靠 "isTablet" 等设备类型布尔值。

  • 在过去,应用的常用模式是利用屏幕宽度以创建类似 "isTablet" 这样的布尔值,从而根据运行应用的设备类型做出调整,但这种方法很不可靠。应用需要使用代理来确定设备类型是这种方法的核心问题,而此类代理容易出错。例如,应用在启动时检测到大显示屏,因此确定该设备是平板电脑。但是,如果应用为了不占据全屏而调整其窗口大小,则可能会出现异常。即使您使用的设备类型布尔值可以响应配置更改,在展开可折叠设备的情况下也会影响用户体验,因为在其他配置发生更改 (如重新折叠设备) 之前,该布尔值无法返回。

🙆 正确做法尽量采用合适的方法取代当前使用设备类型布尔值的方法

查询与要完成的任务所需设备相关的信息。例如:

  • 如果您使用设备类型布尔值来调整布局,可以改为使用 WindowSizeClass。该内容库同时支持视图和 Jetpack Compose,以便您能够简单明确地根据预定义断点调整界面。

// androidx.compose.material3.windowsizeclass.WindowSizeClass
class MainActivity : ComponentActivity() {
  … 
setContent {
val windowSizeClass = calculateWindowSizeClass(this)
WindowSizeClassDisplay(windowSizeClass)
  }


@Composable
fun WindowSizeClassDisplay(windowSizeClass : WindowSizeClass) {
  when (windowSizeClass.widthSizeClass)
  {
WindowWidthSizeClass.Compact   -> {  compactLayout()   }
WindowWidthSizeClass.Medium   -> {  mediumLayout()     }
WindowWidthSizeClass.Expanded   -> {  expandedLayout()   }    
  }
}
  • 视图
    https://developer.android.google.cn/reference/kotlin/androidx/compose/material3/windowsizeclass/WindowSizeClass

  • 如果您使用 isTablet 来更改面向用户的字符串 (如 "您的平板电脑"),那么您可能不需要更多信息便可以轻松解决此问题。您只需使用诸如 "您的 Android 设备" 等更通用的措辞即可。

  • 如果您使用设备类型布尔值来预测电话、蓝牙等硬件功能或资源是否存在,在尝试使用所需功能之前,您可以在运行时直接检查其是否可用,如果功能不可用,则需要妥善处理失败的情况。这种基于功能的方法可确保应用能够恰当地响应可连接或移除的外设。此外,这种方法还可以避免某种功能即使受设备支持,也依然缺失的情况。

val packageManager: PackageManager = context.packageManager
val hasTelephony = 
packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)

🙆 正确做法尽可能使用 Jetpack CameraX

  • 显示相机预览可能极为复杂,这涉及到屏幕方向、宽高比等。在您使用 Jetpack CameraX 时,该库将为您处理尽可能多的细节:

    https://developer.android.google.cn/training/camerax

🙅 错误做法: 假设相机预览的方向会与设备屏幕方向保持一致

  • 在应用中实现相机预览时,需要考虑几种方向: 自然屏幕方向、设备屏幕方向和显示屏幕方向。如要正确实现相机预览,您需要考虑这几种方向,并随着设备条件的变化做出调整。

  • 考虑几种方向
    https://chromeos.dev/en/android/camera-orientation#all-about-orientations

🙅 错误做法假设宽高比是静态的

  • 很多原因都可能导致应用可用窗口的宽高比发生变化。您需要确保相机预览应能够适应不断变化的宽高比。

  • 应用可用窗口的宽高比发生变化
    https://developer.android.google.cn/training/camera2/camera-preview#aspect_ratio

🙆 正确做法: 正确声明硬件功能要求

  • 在声明应用的功能要求时,请参阅《针对大屏设备的实战宝典》中的指南。为了确保您没有不必要地限制应用的受众群体,您需要使用适用于您应用的最详尽的清单条目。

<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
  • 针对大屏设备的实战宝典
    https://developer.android.google.cn/guide/topics/large-screens/large-screen-cookbook

🙅 错误做法: 假设窗口边衬区是静态的

  • 大屏设备的屏幕经常变化,包括其 WindowInsets。因此,请勿只在应用启动时才检查边衬区,而且从不进行更改。

🙆 正确做法使用面向视图的 WindowInsetsListener API

  • 当边衬区发生变化时,WindowInsetsListener API 会通知应用

ViewCompat.setOnApplyWindowInsetsListener(view) { view, windowInsets ->
  val insets = windowInsets.getInsets(
      WindowInsetsCompat.Type.systemBars())
  view.updateLayoutParams<MarginLayoutParams>(
      leftMargin = insets.left,
      bottomMargin = insets.bottom,
      rightMargin = insets.right,
  )
  WindowInsetsCompat.CONSUMED
}

🙆 正确做法在 Jetpack Compose 中使用 windowInsetsPadding Modifier

  • windowInsetsPadding Modifier 会根据给定的窗口边衬区类型动态填充。此外,该 Modifier 的多个实例可以相互通信,以避免添加重复的填充,而且这些实例会自动进行动画处理。

  • windowInsetsPadding Modifier
    https://youtu.be/mlL6H-s0nF0

🙅 错误做法假设设备配备触摸屏

  • 越来越多的用户开始借助鼠标和键盘来使用 Android 应用,但有时您的应用可能无法提供触摸支持,例如当该应用在连接的显示器上显示时。您需要确保应用的所有功能都支持基本的鼠标或触控板互动:

    https://www.youtube.com/watch?v=ucaSqyfpPas

🙆 正确做法在大屏设备上测试应用

  • 为了确保您的应用在大屏设备上拥有出色体验,最重要的是要亲自测试应用。我们为您准备好了一个严格测试计划——大屏设备兼容性测试,欢迎您即刻尝试。

  • 大屏设备兼容性测试
    https://developer.android.google.cn/docs/quality-guidelines/large-screen-app-quality#large_screen_compatibility_tests

🙆 正确做法充分利用 Android Studio 中的大屏设备工具

  • Android Studio 提供了可在开发过程中使用的工具,帮助您更轻松地针对大屏设备优化应用。例如,您可以使用 MultiPreview 注释以同时在多种条件下直观地查看应用。此外,Android 虚拟设备管理器还提供多种平板电脑、桌面设备和可折叠设备的 Android 虚拟设备 (AVD),以便您即刻在大屏设备上测试应用。

  • MultiPreview 注释
    https://developer.android.google.cn/jetpack/compose/tooling/previews#preview-multipreview

  • Android 虚拟设备管理器
    https://developer.android.google.cn/studio/run/managing-avds

5805725aaf5e3d462170e769b20be63d.png

Google I/O 大会精彩回顾

希望这些建议可作为您针对大屏设备优化应用时的良好起点。在今年的 Google I/O 大会上,我们发布了 Google 的最新资讯和创新。您可以查看我们的精彩回顾内容合集获取实用的最新产品动态。也欢迎您持续关注 "Android 开发者" 微信公众号,及时了解更多开发技术和产品更新。

  • Google I/O 大会
    https://io.google/2023/program/

bb02a37f192edfcc748fc170de96fc79.gif

推荐阅读

如页面未加载,请刷新重试

d3e9b4347402f4e548d027ba61f290b5.gif 点击屏末 阅读原文 | 即刻获取针对大屏设备的实战宝典


696ac80389abe6cf538564925891de74.png

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

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

相关文章

数据库信息速递 MONGODB CTO 看数据库发展趋势 与 不使用MONGODB你就要交“创新税”...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群 3群&#xff…

为了女神,我拼了!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

第二十八章 开发Productions - ObjectScript Productions - 定义业务操作

文章目录 第二十八章 开发Productions - ObjectScript Productions - 定义业务操作介绍关键原则定义业务操作类 第二十八章 开发Productions - ObjectScript Productions - 定义业务操作 本页介绍如何定义业务操作类。 提示&#xff1a; IRIS 提供使用特定出站适配器的专用业…

解读大模型的微调

在快速发展的人工智能领域中&#xff0c;有效地利用大型语言模型&#xff08;LLM&#xff09;变得越来越重要。然而&#xff0c;有许多不同的方式可以使用大型语言模型&#xff0c;这可能会让我们感到困惑。实际上&#xff0c;可以使用预训练的大型语言模型进行新任务的上下文学…

【移动架构】Flutter和React Native:最后的PK

首先&#xff0c;有点离题。做出决定的最简单方法是回顾历史。让我们沿着怀旧之路走一趟。早在2000年初&#xff0c;JAVA就有两个UI框架。一个是AWT&#xff0c;它是一种为多个操作系统构建UI的方法&#xff0c;同时仍然保持操作系统的外观。 每个操作系统都有自己的组件&#…

驱动开发--创建设备文件--控制LED灯

目录 1、手动创建设备文件 2、应用程序如何将数据传递给驱动 3、控制LED灯&#xff1a; 4、应用层控制灯 5、自动创建设备节点 1、手动创建设备文件 cat /proc/devices 查看主设备号 sudo mknod hello(路径&#xff1a;任意的) c/b&#xff08;C代表字符设备 b代表块设备&a…

华为无线AC双机热备三层组网配置案例

核心交换机: dis current-configuration sysname hx undo info-center enable vlan batch 10 66 88 99 to 100 ip pool vlan10 gateway-list 192.168.10.254 network 192.168.10.0 mask 255.255.255.0 dns-list 8.8.8.8 ip pool vlan100 gateway-list 172.16.100.254 network …

Qt在MySQL中存储音频文件

一、在存储音频视频等大文件时需要以二进制文件进行存储&#xff0c;首先需要了解mysql存储二进制文件的字段类型以及大小&#xff1a; 需要创建数据库中的图片类型为&#xff1a;二进制mediumblob类型&#xff0c;&#xff08; TinyBlob 最大 255 Blob 最大 65K MediumBlob …

苹果发布会,卧槽,卧槽,卧槽

今天跟二哥在群里聊到苹果的发布会&#xff0c;二哥完整的看了发布会&#xff0c;我随口问一句二哥看完后什么感受。 二哥说「苹果的工业设计还是遥遥领先&#xff0c;交互设计也是一流水准&#xff0c;然后价格也是遥遥领先」。 然后&#xff0c;我今天也抽空看了关于苹果新发…

【算法与数据结构】203、LeetCode移除链表元素

文章目录 题目一、解题思路完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 题目 一、解题思路 思路分析&#xff1a;这道题需要注意一个特殊情况&#xff0c;当删除的是头结点时&#xff0c;直接删除就找不到整个链表。因此我…

2023LRC软件、Adobe Lightroom Classic下载、安装教程

最后附下载地址 LRC简介&#xff1a; Adobe Lightroom Classic&#xff08;简称LR&#xff09;是Adobe Creative Cloud大家庭中的一款专业的图片管理和编辑工具&#xff0c;用于专业摄影师、摄影爱好者以及所有不断优化数码影像的人等。其目标是以丰富的功能提供高效、一致的…

03【WebStorm开发工具】

上一篇&#xff1a;02【HTML快速入门】 下一篇&#xff1a;04【】 目录&#xff1a;【HTML5系列教程】 文章目录 三、WebStorm开发工具3.1 WebStorm简介3.2 WebStorm安装3.3 WebStorm基本使用3.3.1 创建项目3.3.2 调整字体大小3.3.3 代码自动补全3.3.4 WebStorm常用快捷键 三…

在Anaconda的虚拟环境中添加环境变量并通过python访问(win/mac/linux)

一、前言 有的时候密码登比较敏感的信息&#xff0c;不方便直接写在代码里有很多变量我想很多project都可以访问到 那这时候使用环境变量是非常合适的了。 二、设置环境变量 以linux为例 直接在internal执行命令 export 变量值通过更改bashc文件 vim ~/.bashrc # 在最后一行加上…

【双向链表】

双向链表 带头双向循环链表的实现1. 函数的声明2. 函数的实现3. 主函数测试 带头双向循环链表的实现 今天我们来实现一下带头双向循环链表&#xff0c;顾名思义&#xff0c;带头就是有哨兵位&#xff0c;哨兵位不是链表的头&#xff0c;它是连接头节点的一个节点&#xff0c;方…

ChatGPT提示词攻略之迭代提示词

当我们在调试程序时&#xff0c;通常很难一次就把程序正常跑起来。这是普遍现象。但我们会借助一些工具和手段&#xff0c;有步骤有流程地去调整程序&#xff0c;最终让程序按照我们想要的样子正常执行。 对于提示词来说也是一样的。当我们向ChatGPT提问时&#xff0c;一开始它…

从操作系统角度了解内存管理

一.内存管理 1.主要功能 内存管理的主要功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地址与内存中的物理地址不可能一致, …

Effective第三版 中英 | 第二章 创建和销毁对象 | 固定资源首选使用依赖注入

文章目录 Effective第三版前言第二章 创建和销毁对象固定资源首选使用依赖注入 Effective第三版 前言 大家好&#xff0c;这里是 Rocky 编程日记 &#xff0c;喜欢后端架构及中间件源码&#xff0c;目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔记&#xff0…

接招吧!MySQL 10 连问

文章目录 &#x1f349;1. 索引底层采用什么数据结构&#xff1f;为什么不用hash&#x1f349;2. B树与B树区别&#xff1f;为何用B树&#xff1f;&#x1f349;3. 自增主键理解&#xff1f;&#x1f349;4. 为什么自增主键不连续&#x1f349;5. Innodb为什么推荐用自增ID&…

Jetpack Compose 中的基础组件

Button 默认样式 Button的lambda块中可以传入任意的Composable组件&#xff0c;但一般是放一个Text在里面 Button(onClick { println("确认onClick") }) {Text("默认样式") }按钮的宽高 如果想要宽一点或高一点的Button&#xff0c;可以通过Modifier修…

chatgpt赋能python:Python平面图制作教程

Python平面图制作教程 Python是一种高级编程语言&#xff0c;也是数据科学和机器学习领域中使用最广泛的编程语言之一。在数据可视化中&#xff0c;Python语言具有优秀的表现力和灵活性&#xff0c;可以为用户展示各种数据可视化方案。这篇文章将重点介绍Python如何制作平面图…