移动应用中的高对比度(High Contrast) — 什么是高对比度、无障碍与对比度设置

作者: IT Sectr 发布日期: 2026-05-16 阅读时间: 13 分钟

高对比度(High Contrast) — 操作系统的无障碍模式,可增加界面元素的色彩对比度以改善可辨识度。在iOS中,Increase Contrast功能位于Settings > Accessibility > Display & Text Size,允许分别增强文本、按钮和边框的对比度。在Android中,类似的高对比度文本(High Contrast Text)模式可在设置 > 无障碍 > 高对比度文本中找到。根据世界卫生组织的数据,至少有22亿人患有视力障碍,对他们而言高对比度至关重要。

要点

  • 高对比度(High Contrast) — 为移动和桌面操作系统的无障碍性提高色彩对比度的模式
  • iOS Increase Contrast — 三个开关:提高文本、按钮和边框的对比度
  • Android 高对比度文本 — 在深色背景上叠加白色文本以获得最大对比度
  • WCAG 对比度 — 普通文本标准为4.5:1,大文本为3:1(AA级)
  • CSS prefers-contrast — 用于根据系统对比度设置调整样式的媒体功能

无障碍中的高对比度是什么?

高对比度(High Contrast) 是一种显示模式,操作系统或应用程序通过增加前景(文本、图标)和背景之间的颜色差异来工作。根据WCAG AA标准,普通文本的最低对比度为4.5:1,大文本(从18pt或14pt粗体开始)为3:1。高对比度模式可将对比度提高到7:1或更高,实现最大的可辨识度。

与简单的背景变暗或文本变亮不同,高对比度全方位运作:将界面的颜色方案替换为一组有限的高对比度颜色,在元素周围添加轮廓,并消除半透明效果。该模式适用于视力下降、畏光和某些形式的色盲人士。

三种类型的高对比度:系统级(在操作系统中启用并影响所有应用程序)、应用级(单个应用程序内的内置模式)和网页级(CSS媒体功能prefers-contrast)。系统级高对比度最为强大,因为它可以覆盖那些没有自带无障碍支持的应用程序中的颜色。

谁需要高对比度

高对比度的主要用户 — 白内障患者(晶状体混浊降低对比敏感度)、黄斑变性(中央视力丧失)、青光眼和糖尿病视网膜病变患者。在强光下工作时也需要此模式 — 高对比度可补偿屏幕上的眩光。根据WebAIM(2025)的数据,86%的网页文本对比度低于WCAG AA标准 — 用户端的高对比度部分弥补了这一缺陷。

iOS中的Increase Contrast:设置与对比度类型

iOS中,Increase Contrast功能位于Settings > Accessibility > Display & Text Size,包含三个独立开关:Increase Contrast(总体增强)、Darken Colors(暗化明亮颜色)和Reduce Transparency(降低透明度)。Increase Contrast是影响文本、按钮和系统元素边框的主要开关。

从技术上讲,iOS通过tintColor和UIVisualEffectView层实现Increase Contrast。激活后,系统会提高深色调的alpha值并降低浅色调的alpha值,将所有UI元素的对比度提高2-3个点。Reduce Transparency将半透明背景(磨砂玻璃效果)替换为不透明背景,从而进一步提高模糊背景上文本的可读性。

在iOS应用程序中检查Increase Contrast

开发人员可以通过UIAccessibility检查Increase Contrast的状态并调整颜色。例如,如果对比度已提高,则可以使用更饱和的强调色,如果没有 — 通过默认调色板确保4.5:1的基本对比度。UIAccessibility.isReduceTransparencyEnabled在活动模式下禁用模糊效果也很有用。

swift
import UIKit

class ContrastManager {

    // 检查Increase Contrast状态
    static var isIncreaseContrastEnabled: Bool {
        return UIAccessibility.isDarkerSystemColorsEnabled
    }

    // 检查Reduce Transparency
    static var isReduceTransparencyEnabled: Bool {
        return UIAccessibility.isReduceTransparencyEnabled
    }

    // 调整颜色以适应高对比度模式
    static func adjustedAccentColor() -> UIColor {
        guard isIncreaseContrastEnabled else {
            return .systemBlue
        }
        // 高对比度活动时更饱和的蓝色
        return UIColor(red: 0.0, green: 0.35, blue: 0.9, alpha: 1.0)
    }

    // 考虑Reduce Transparency的背景颜色
    static func backgroundColor() -> UIColor {
        if isReduceTransparencyEnabled {
            return .systemBackground // 不透明背景
        }
        return UIColor.systemBackground.withAlphaComponent(0.85)
    }

    // 订阅更改
    static func observeChanges(observer: Any, selector: Selector) {
        NotificationCenter.default.addObserver(
            observer,
            selector: selector,
            name: UIAccessibility.darkerSystemColorsStatusDidChangeNotification,
            object: nil
        )
        NotificationCenter.default.addObserver(
            observer,
            selector: selector,
            name: UIAccessibility.reduceTransparencyStatusDidChangeNotification,
            object: nil
        )
    }
}

// 使用示例:UINavigationBar
func applyContrastToNavigationBar(_ navBar: UINavigationBar) {
    if ContrastManager.isIncreaseContrastEnabled {
        navBar.isTranslucent = false
        navBar.barTintColor = ContrastManager.backgroundColor()
        navBar.titleTextAttributes = [
            .foregroundColor: UIColor.label,
            .font: UIFont.boldSystemFont(ofSize: 18)
        ]
    }
}

ContrastManager类通过isDarkerSystemColorsEnabled提供对Increase Contrast状态的访问,在活动模式下调整强调色,禁用导航栏的半透明效果,并订阅有关对比度变化的系统通知。当UIAccessibility状态发生变化时,UIKit会自动重绘元素。

iOS动态颜色(UIColor Well)与对比度

iOS提供动态UIColor颜色(systemBackground、label、secondaryLabel),这些颜色会自动适应Increase Contrast模式。启用Increase Contrast后,系统颜色会改变其值:label变得更暗(或在深色主题中更亮),background失去半透明效果。建议开发人员对所有UI元素使用动态颜色,以避免与系统对比度冲突。

Android中的高对比度文本:深色主题与对比度

Android中,高对比度文本功能的工作方式与iOS不同。Android不是逐步提高对比度,而是应用反向配色方案:深色背景和更粗的白色文本。该模式在AMOLED显示屏上尤其有效,因为黑色可提供最大对比度。该设置位于设置 > 无障碍 > 可见性增强中。

Android高对比度文本使用两种机制:通过主题覆盖(theme overlay)重写颜色调色板和应用ColorMatrix来增加位图图像的对比度。系统分析应用程序的当前主题(亮色/暗色),并应用具有最大对比度的叠加层:白色前景(#FFFFFF)在黑色背景(#000000)上。半透明元素获得不透明底座。

通过Android API检查高对比度文本

要检查Android中高对比度文本的状态,需要使用AccessibilityManager和ContentResolver。API允许确定模式是否处于活动状态并相应地调整UI。Jetpack Compose支持通过CompositionLocalProvider和LocalContrast进行适配。

kotlin
import android.accessibilityservice.AccessibilityService
import android.content.Context
import android.provider.Settings
import android.view.accessibility.AccessibilityManager
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color

class HighContrastHelper {

    // 通过AccessibilityManager检查
    fun isHighContrastTextEnabled(context: Context): Boolean {
        val am = context.getSystemService(
            Context.ACCESSIBILITY_SERVICE
        ) as AccessibilityManager
        return am.isEnabled && am.getEnabledAccessibilityServiceList(
            AccessibilityService.FEEDBACK_ALL_MASK
        ).any { it.resolveInfo.serviceInfo.packageName ==
            "com.android.server.accessibility" }
    }

    // 通过全局设置检查
    fun isHighContrastFromSettings(context: Context): Boolean {
        return try {
            Settings.System.getInt(
                context.contentResolver,
                "high_text_contrast_enabled"
            ) == 1
        } catch (e: Settings.SettingNotFoundException) {
            false
        }
    }

    // Jetpack Compose — 考虑对比度的颜色
    @Composable
    fun contrastAwareColors(): Pair<Color, Color> {
        val context = androidx.compose.ui.platform.LocalContext.current
        return if (isHighContrastTextEnabled(context)) {
            Color.White to Color.Black
        } else {
            Color.Black to Color.White
        }
    }
}

// View系统:动态颜色选择器
class ContrastTextView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : AppCompatTextView(context, attrs) {

    private val helper = HighContrastHelper()

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        if (helper.isHighContrastTextEnabled(context)) {
            setTextColor(Color.WHITE)
            setBackgroundColor(Color.BLACK)
            setTypeface(getTypeface(), Typeface.BOLD)
        }
    }
}

HighContrastHelper类通过AccessibilityManager和系统设置检查高对比度的活动状态,在Jetpack Compose中调整颜色,并为View系统提供自定义的ContrastTextView。与iOS不同,Android中没有直接的高对比度更改通知 — 必须使用Settings.System上的ContentObserver进行动态更新。

Material Design 3与高对比度

Material Design 3(Material You)通过Dynamic Color包含对高对比度的内置支持。在系统模式激活时,Material 3会自动选择最大的色调调色板:background = Neutral0、onBackground = Neutral100、primary = Primary100。开发人员只需使用MD3组件 — 系统将负责对比度的适配。

WCAG对比度:4.5:1和3:1标准

WCAG对比度 — 两种颜色之间的数学亮度比,用于评估文本的无障碍性。该标准定义了两个阈值:普通文本为4.5:1(AA级),大文本(从18px/14px粗体)为3:1。AAA级要求普通文本为7:1,大文本为4.5:1。高对比度模式理想情况下应提供7:1或更高的对比度。

对比度的计算公式为:(L1 + 0.05) / (L2 + 0.05),其中L1是较亮颜色的相对亮度,L2是较暗颜色的相对亮度。相对亮度根据sRGB通道加权计算:0.2126R + 0.7152G + 0.0722B。对于无障碍开发人员来说,使用工具就足够了:WebAIM Contrast Checker、Color Contrast Analyser或Xcode中的Accessibility Inspector。

WCAG 2.2对比度阈值表

级别普通文本大文本(18px/14px粗体)UI组件
AA4.5:13:13:1
AAA7:14.5:1
iOS高对比度~7:1~5.5:14.5:1
Android高对比度~10:1~10:17:1

在代码中检查对比度

要在Web应用程序中自动检查对比度,可以使用JavaScript。在高对比度模式激活时,建议突出显示不符合AA标准的元素。下面是一个用JavaScript计算相对亮度和对比度的示例。

js
// 根据WCAG 2.2计算对比度
class ContrastChecker {

    // 将sRGB转换为线性空间
    linearize(channel) {
        const s = channel / 255
        return s <= 0.04045
            ? s / 12.92
            : Math.pow((s + 0.055) / 1.055, 2.4)
    }

    // 相对亮度(relative luminance)
    relativeLuminance(r, g, b) {
        const R = this.linearize(r)
        const G = this.linearize(g)
        const B = this.linearize(b)
        return 0.2126 * R + 0.7152 * G + 0.0722 * B
    }

    // 两种颜色之间的对比度
    getContrastRatio(hex1, hex2) {
        const rgb1 = this.hexToRgb(hex1)
        const rgb2 = this.hexToRgb(hex2)
        const L1 = this.relativeLuminance(rgb1.r, rgb1.g, rgb1.b)
        const L2 = this.relativeLuminance(rgb2.r, rgb2.g, rgb2.b)
        const lighter = Math.max(L1, L2)
        const darker = Math.min(L1, L2)
        return (lighter + 0.05) / (darker + 0.05)
    }

    hexToRgb(hex) {
        const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
        return result ? {
            r: parseInt(result[1], 16),
            g: parseInt(result[2], 16),
            b: parseInt(result[3], 16),
        } : null
    }

    // 检查AA级别(4.5:1)
    passesAA(hex1, hex2) {
        return this.getContrastRatio(hex1, hex2) >= 4.5
    }

    // 检查AAA级别(7:1)
    passesAAA(hex1, hex2) {
        return this.getContrastRatio(hex1, hex2) >= 7.0
    }
}

// 使用
const checker = new ContrastChecker()
console.log(checker.getContrastRatio("#333333", "#FFFFFF"))
// → 13.2:1 (AAA)
console.log(checker.passesAA("#999999", "#FFFFFF"))
// → false (2.8:1)

JavaScript中的ContrastChecker类实现了根据WCAG 2.2的完整对比度计算:将sRGB转换为线性空间、使用Rec.709权重计算相对亮度以及与AA/AAA阈值进行比较。该工具在开发支持高对比度的Web应用程序时,对于颜色方案的自动审核非常有用。

使用工具审核对比度

要在完成的应用程序中检查对比度,请使用Accessibility Scanner(Android)、Xcode Accessibility Inspector(iOS)或axe DevTools(Web)。这些工具会自动找到对比度低于WCAG AA的元素并突出显示它们。审核期间应启用高对比度模式 — 这将显示系统的对比度增强是否足以达到7:1。

CSS prefers-contrast:使网页适应系统对比度

CSS媒体功能prefers-contrast允许网页根据用户的系统对比度设置调整样式。该功能接受以下值:no-preference(默认)、more(用户启用了高对比度)、less(用户偏好低对比度)和custom(精确设置)。自2022年以来得到所有现代浏览器的支持。

prefers-contrast: more — 给Web开发人员的信号:提高文本对比度、将半透明背景替换为不透明背景、增强交互元素的边框以及移除低对比度的背景图像。iOS Safari和Android Chrome在启用系统高对比度模式(Increase Contrast / 高对比度文本)时会传递more值。

通过prefers-contrast进行适配的示例

prefers-contrast: more时,网页应最小化颜色数量,并优先使用带有强调色的黑白调色板。下面是一个CSS适配示例,包括颜色替换、禁用半透明和增加边框。

css
/* 基本样式(no-preference) */
.card {
    background: rgba(255, 255, 255, 0.9);
    border: 1px solid rgba(0, 0, 0, 0.1);
    color: #333;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}

.button {
    background: #0066CC;
    color: #FFFFFF;
    border: none;
    padding: 12px 24px;
}

/* 高对比度:more */
@media (prefers-contrast: more) {
    .card {
        background: #FFFFFF;
        border: 2px solid #000000;
        color: #000000;
        box-shadow: none;
    }

    .button {
        background: #004499;
        outline: 2px solid #000000;
        outline-offset: 2px;
    }

    .muted-text {
        color: #000000; // 原来是#666 — 现在是黑色
    }

    .overlay {
        background: rgba(0, 0, 0, 0.8); // 原来是0.4 — 已增强
    }
}

/* 低对比度:less */
@media (prefers-contrast: less) {
    .card {
        border: 1px solid rgba(0, 0, 0, 0.05);
        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
    }
}

CSS示例中,当prefers-contrast: more时,卡片获得不透明白色背景、2px黑色边框、文本变为黑色(#000代替#333),按钮 — 深蓝色带黑色轮廓以便可见。当prefers-contrast: less(罕见情况 — 用户偏好柔和颜色)时,对比度则降低。

与prefers-color-scheme结合

为了实现完全的无障碍适配,prefers-contrast与prefers-color-scheme(浅色/深色主题)结合使用。在prefers-color-scheme: dark和prefers-contrast: more时,颜色应为黑色背景上的白色,带有明亮的强调色。在浅色主题下 — 白色背景上的黑色。这些媒体功能的组合提供了4种组合,需要进行测试以实现完全的无障碍覆盖。

常见问题

移动应用中的高对比度是什么?

高对比度(High Contrast) — 一种无障碍模式,可为视力障碍人士增加界面元素的色彩对比度。在iOS中,该设置称为Increase Contrast(设置 > 辅助功能 > 显示与文字大小),在Android中称为高对比度文本(设置 > 无障碍)。该模式将颜色替换为高对比度颜色,消除半透明效果并增强边框。

如何在iOS应用程序中检查高对比度?

要在iOS中检查高对比度,请使用UIAccessibility.isDarkerSystemColorsEnabled(布尔值)。要跟踪更改,请订阅UIAccessibility.darkerSystemColorsStatusDidChangeNotification。UIKit在模式激活时动态更改颜色 — 使用系统UIColor颜色(systemBackground、label、secondaryLabel)进行自动适配。

Android中的高对比度文本如何工作?

Android高对比度文本应用反向配色方案 — 更粗的白色文本在黑色背景上。该模式使用主题覆盖(theme overlay)和ColorMatrix来增加对比度。Material Design 3在高对比度激活时自动调整颜色 — 开发人员只需使用MD3组件和Android 12+的Dynamic Color即可。

WCAG对文本对比度的要求是什么?

WCAG定义了对比度:AA级要求普通文本为4.5:1,大文本(从18px或14px粗体)为3:1。AAA级 — 普通文本为7:1,大文本为4.5:1。计算使用公式(L1 + 0.05) / (L2 + 0.05),利用sRGB通道的相对亮度及Rec.709权重。

CSS prefers-contrast如何使网页适应高对比度?

CSS媒体功能prefers-contrast: more允许网页在系统高对比度时增加对比度:将rgba背景替换为不透明背景、将边框增强到2px、使文本在白色背景上变为黑色、并禁用box-shadow。与prefers-color-scheme结合可完全适应深色主题+高对比度。自2022年以来得到所有现代浏览器的支持。

总结

  • 高对比度(High Contrast) — 系统无障碍模式,为视力障碍人士(白内障、黄斑变性)提高界面对比度
  • iOS Increase Contrast — 三个开关:总体对比度、暗化颜色、降低透明度
  • Android高对比度文本 — 白色在黑色上的反向方案,具有更粗的文本和AMOLED优化
  • WCAG对比度 — AA = 4.5:1,AAA = 7:1;无障碍合规所必需
  • CSS prefers-contrast: more — 用于使Web样式适应系统高对比度的媒体功能(自2022年起支持)
  • 动态颜色 — iOS UIColor.systemBackground和Android MD3 Dynamic Color自动适应对比度
  • 审核工具 — Accessibility Scanner(Android)、Xcode Inspector(iOS)、axe DevTools(Web)用于检查对比度

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读