AICon上海「Agent与多模态解决方案专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

优酷暗黑模式(一):是什么、为什么、如何落地?

  • 2020-02-24
  • 本文字数:2863 字

    阅读完需:约 9 分钟

优酷暗黑模式(一):是什么、为什么、如何落地?

优酷主客从 20191125 版本开始,Android 和 iOS 双端均已全量支持“暗黑模式”,欢迎大家试用并提出宝贵意见。

一、缘起

随着 iOS 13 和 Android 10 的正式发布,一个名词"暗黑模式(Dark Mode)"逐渐走入了大家的视野。各大 App 都将暗黑模式的适配列入了开发日程,舆情上用户们对暗黑模式支持的呼声也非常的高。优酷主客也顺应时势,启动了相应的技术预研。



从 2019 年 11 月开始,优酷主客 Android 端和 iOS 端使用了两个版本的时间,推动各业务方基本完成了主要使用路径上数十个页面的改造,还使用同一套方案同步完成了部分 Weex 页面和 H5 页面的适配,并完整地通过了 UED 的视觉验收。


当前,到 App Store 和各大 Android 市场下载的优酷 App 最新版本,均已全量支持“暗黑模式”,欢迎大家试用并提出宝贵意见。


我们邀请了参与优酷 App 暗黑模式设计/开发/测试的同学们编写了一系列文章,全面介绍了整个项目的实施流程和经验教训,也是对整个项目做一个完整的总结。


随着 iOS13 和 Android10 系统的占比越来越高,相信暗黑模式的支持会逐步列入各位读者的时间表。希望我们的心得分享能帮助到大家,也欢迎大家参考优酷实现暗黑模式的设计/技术方案,完成自己 App 的暗黑模式接入。

二、什么是暗黑模式?

不考虑计算机工业早期的黑色底,绿色字符的终端界面,暗黑模式的概念主要来源于 MacOS,该系统为用户提供两个外观,即"浅色"和"深色"。



自从有了这个概念之后,很多网站都为用户提供了“浅色”和“深色”两套界面,便于用户根据自己的习惯或爱好进行切换。



在 MacOS 之后,很多 App 和 Android 定制 ROM 也加入了所谓"深色模式"的支持; 在 iOS 13 和 Android 10 发布之后,“暗黑模式” 终于被添加到官方支持的特性列表。

三、为什么要支持暗黑模式?

根据 Apple 官方的说法,暗黑模式可以“改善电池寿命,改善视力不佳和强光下的人的可视性,以及在弱光环境中更好地使用设备”。


1. 改善电池寿命

从下图中 notebookcheck 的功耗分析可以看出,在使用 OLED 屏幕时,屏幕上显示的内容决定了功耗。当屏幕基本全黑时,OLED 屏在任何亮度下的功耗都保持恒定。显示了白色内容的屏幕,功耗曲线会随着亮度提高而逐渐变陡。



图片来源:https://www.notebookcheck.net/Display-Comparison-OLED-vs-IPS-on-Notebooks.168753.0.html

2. 改善视力不佳用户的可视性

我们面对的用户群体中有一部分是色盲或者色弱用户,暗黑模式对于色盲/色弱用户群体是非常友好的。

3. 弱光环境中的使用


在温暖的被窝中也可以舒服地看剧了,再也不用害怕被白色背景闪瞎眼了。

4. UI 风格的统一

业务开发中难免会用到系统默认控件,而系统默认控件都支持了暗黑模式。如果自定义控件不支持的话,当用户打开暗黑模式后,就会发现风格不统一的情况。


以 iOS 为例,在下图的界面中,Tabbar 已经被转成暗黑模式的样式,但画面上方的组件、文字因为都是自定义颜色/样式,并没有随着模式切换而自动调整,这也让整个画面看起来不太协调。



如果短时间内没有精力支持暗黑模式,也可以在开发阶段强制指定不支持暗黑模式。


对于 iOS,需要在 App 的 Info.plist 里面添加名称为 User Interface Style, 类型为 String 的项目,将 User Interface Style 的值设置为 Light,声明"只支持 Light Mode",就可以避免系统控件转换为暗黑状态。


对于 Android,需要在 App 的 Application 里面调用下面的代码,声明不支持暗黑模式。


AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
复制代码

四、暗黑模式的官方文档

暗黑模式的官方设计指南,可以参考 iOS 和 Android 的官方文档


iOS:


https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/dark-mode/


Android:


https://developer.android.com/guide/topics/ui/look-and-feel/darktheme


https://material.io/design/color/dark-theme.html


要支持暗黑模式,绝不是将界面上的浅色元素改为深色元素就大功告成; 否则我们只需要编排一份浅色和深色色值的颜色转换表,以及一份适用于暗黑模式的素材, 然后简单地对 App 进行改写就可以了。


以 iOS 为例,为了支持系统级别的暗黑模式主题,以及系统内置 App 同步支持暗黑模式下的界面,iOS 系统在屏幕(Screen), 视图(View), 菜单(Menu)和组件(Controls)上使用了 Apple 新定义的 “Darker Color Palette”。


这套 Color Palette 的主要目的,在于透过调整颜色的饱和度, 做出视觉层级,提升颜色的对比性,让所有组件能够以合适的状态在暗黑模式中进行操作。


基于暗黑模式进行的界面设计并不是一个颜色调整一下就可以快速解决的任务。由于暗色系的一些特性,原本用来建立视图层级(例如阴影)或者色彩对比(白底黑字)的概念都需要被重新设计,设计师们需要以全新的思维去应对视觉上的每个细节。


也因为新增暗黑模式支持这一大幅度的改动,Apple 也重新定义了自己的 UI 设计指南,除了强调设计师们应该 “更专注于内容”,也在原有的设计 "Light Mode"基础上,提出 5 个原则进行调整。


  • 维持操作上的熟悉性

  • 维持平台上的一致性

  • 清楚的信息层级

  • 无障碍操作

  • 保持简单

五、暗黑模式的设计

由此可见,暗黑模式带来的是一整套的全新设计理念。对应而来的,就是对现有 App 设计元素的全盘重构,这在设计和开发侧来讲,都是庞杂繁琐的工程,涉及优酷几乎全部业务的的界面适配。


在《优酷暗黑模式设计指南》一文中,优酷的 UED 们讲述了他(她)们对于暗黑模式在优酷 App 实际落地的深度思考。

六、暗黑模式的架构支撑

在 UED 给出了完整设计方案之后,我们的技术架构同学需要给出完整的技术支撑方案,完美地还原 UED 的视觉设计。


然而,具体落地到实现上,我们不得不回答如下几个问题


  • iOS 和 Android 的实现方案如何尽可能地保持一致性

  • 如何在 iOS 12 和 Android 9 及其以下系统也能支持暗黑模式,并与 iOS 13 和 Android 10 以上系统保持技术方案的统一

  • 如何复用 Native 端的实现方案,同步支持 Weex/H5,甚至延伸至未来的小程序和 Flutter


在“优酷设计标准化体系的技术实现”,“暗黑模式的技术支撑(Android)”,“暗黑模式的技术支撑(iOS)”“暗黑模式的技术支撑(Weex & H5)”这几篇文章中,我们通过实现“优酷设计标准化体系”,完整地给出了技术侧的思考。

七、暗黑模式的业务改造

当底层架构设计已经完毕,就要对优酷主客的所有页面进行适配,改造工作涉及数十位 UED 和开发同学。


在如此短的开发周期之内,既要完成正常的业务开发,又要完成如此大规模的改造,还要通过 UED 的视觉验收。


我们的业务侧开发同学是如何完成这个艰巨任务的呢?


请看“优酷暗黑模式在分发场景的落地(Android&iOS)”,“暗黑模式在优酷消费场景的落地(iOS)”,“暗黑模式在优酷消费场景的落地(Android)》”。

八、暗黑模式的测试和上线

暗黑模式的最终上线,涉及优酷 App 几乎全部页面的适配和改造,为 QA 同学的测试工作带来的前所未有的挑战。


那么,他(她)们是如何完成繁重的测试任务,保证了优酷 App 按时发布上线的呢?


请看文章“优酷 App 暗黑模式的质量保证”。


作者简介


凯冯,阿里文娱无线开发专家。


2020-02-24 10:002377

评论

发布
暂无评论
发现更多内容

爆赞!GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java 编程 程序员 架构师 IntelliJ IDEA

21分钟 MySQL 入门教程

???

MySQL 编程

限时分享:Alibaba技术官整理出来的Java零基础学习笔记

Java架构师迁哥

架构之:并发和并行

程序那些事

架构 软件架构 架构师 程序那些事

使用 Quarkus 和 MicroProfile 实现微服务特性

张晓辉

Kubernetes 云原生 Quarkus Microprofile

☕【JVM 技术之旅】深入JVM回收器之Parallel Scavenge(上篇)

码界西柚

JVM GC 垃圾收集 5月日更 Parallel Scavenge

架构师实战营 模块五作业(设计微博评论的高性能高可用计算架构)

代廉洁

架构实战营

原来真的有外卖员转行学Java,还三面“拿下”拼多多offer!

Java架构师迁哥

架构师实战营模块五

ifc177

随机数在区块链中的应用

CECBC

Spark如何进行动态资源分配

数据社

spark 5月日更

通过混沌测试发现 HTTP/2 缺陷

卫智雄

已经成功拿到字节offer,阿里内部二十三万字 Java 面试题总结

Java 程序员 架构 面试

女裤裤兜如何影响工业设计?

脑极体

开箱即用的 Prometheus 告警规则集

张晓辉

监控 Prometheus 告警

阿里内部面试手册,Github 上获赞 80K,无论工作几年都可以看看

Java 编程 架构 面试

小王毕业两年转行学Java,现在过得比科班生过得还好?

Java架构师迁哥

ubuntu64 位搭建 OpenVINO 系统(下篇)

IT蜗壳-Tango

5月日更

交叉验证

Qien Z.

5月日更 交叉验证

Java也太卷了,应届生找工作都需要准备这些知识点了!

Java架构师迁哥

🔎【Java源码探索】深入浅出的分析 ThreadPoolExecutor

码界西柚

Java 线程池工作原理 ThreadPoolExecutor 5月日更 Worker

华为内部论坛爆火的一份:Java面试培训笔记,秒变资深面试官

Java架构师迁哥

21岁就走了“狗屎运”(4面拿字节跳动offer Java岗)

Java架构师迁哥

Nginx利用resolver实现动态upstream

运维研习社

nginx 运维 5月日更 动态负载均衡

如何成为一名拖垮整个团队的产品经理?

冰河

深度思考 产品经理 自我思考 产品经历 技能提升

有点东西,GC与内存泄漏之间的联系分不清,居然也可以进微软?

Java架构师迁哥

Spring XML Schema扩展机制源码解读

Hex

Java spring 后端 Java EE

基于ECS搭建FTP服务

若尘

阿里云 服务器 5月日更

这是我在银四拿到的第6个offer!分享我的成功秘籍:阿里巴巴 Java 面试参考指南(2021 最新版)

Java 程序员 架构 面试

消息队列并不能解耦

Xargin

网络攻防学习笔记 Day30

穿过生命散发芬芳

5月日更 网络攻防

优酷暗黑模式(一):是什么、为什么、如何落地?_移动_阿里巴巴文娱技术_InfoQ精选文章