写点什么

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

  • 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:002256

评论

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

徒手撸一个Spring Boot中的starter

田维常

springboot

一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

刘悦的技术博客

flask k8s kubectl Docker Desktop gunicorn

民进昆明市委:建议利用区块链技术优势在昆明打造金融应用平台

CECBC

金融 金融区块链

GrowingIO SaaS 产品 CI/CD 实践 (一)

GrowingIO技术专栏

ci SaaS CD

互助系统软件开发,互助app开发

luluhulian

“新内容 新交互” 阿里云全球视频云创新挑战赛正式开启!

阿里云CloudImagine

阿里云 音视频 应用

原来这就是大厂的MySQL主从复制、读写分离及高可用方案!

MySQL 数据库 架构

区块链+电力,又擦出什么新火花?

CECBC

区块链

2021年 区块链最火的app爱打卡

v16629866266

OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践

阿里巴巴云原生

人工智能 容器 运维 云原生 k8s

基于SpringBoot的微服务架构与K8S容器部署实践

Java 架构 微服务

如何快速上手 angular.js

华为云开发者联盟

html Vue 数据 angular js

【春节不远行,云上过大年】来华为云社区,接任务领新年红包啦···

华为云开发者联盟

华为云

以终为始:28天打卡输出复盘

熊斌

个人成长 写作平台 28天写作

滴滴夜莺二次开发全搞定

滴滴云

开源 监控 滴滴夜莺 夜莺监控 运维平台

16张图带你吃透Redis架构演进

Kaito

redis 架构 高性能

PM必备自我管理工具整理

Geek_mktupf

项目管理 PM

零基础实现Java直播(一):集成

ZEGO即构

一周信创舆情观察(1.25~1.31)

统小信uos

面试加分项!零基础如何成为高级Android开发,先收藏了

欢喜学安卓

android 程序员 面试 移动开发

开放下载!解锁 Serverless 从入门到实战大“橙”就

阿里巴巴云原生

云计算 Linux Serverless 开发者 云原生

28天总结

张老蔫

28天写作

今年我读了四个开源项目的源码,来分享下心得

yes

源码 面试 后端

LeetCode题解:529. 扫雷游戏,DFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

您的《操作系统线程模型总结》请查收。

后台技术汇

28天写作 2月春节不断更

面试加分项!我在美团Android研发岗工作的那5年,系列篇

欢喜学安卓

android 程序员 面试 移动开发

《iOS面试简历技巧解析》

ios 面试

🌏 超详细 DNS 协议解析

飞天小牛肉

Java 程序员 面试 计算机网络 2月春节不断更

2021全新iOS学习方向

ios 逆向

短信验证码被刷怎么办?java 短信验证码防刷策略分析

香芋味的猫丶

黑客 短信防刷 短信验证码 短信防轰炸 短信防火墙

淘宝的商品中心和类目体系是怎么设计的

邴越

架构 阿里 模型 电商 业务

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