25、国际化与无障碍:多语言支持、TalkBack适配、字体缩放兼容

国际化与无障碍,这两个词听起来有点官方,对吧?

说白了,就是让你的虹膜识别功能,不管在哪个国家、哪种语言环境下,都能正常工作。而且,就算用户视力不太好、需要靠语音辅助来操作手机,你的功能也不能掉链子。

我刚开始做国际化的时候,觉得不就是翻译几个字符串嘛,有什么难的?结果被坑了几次之后,才明白这里面的门道有多深。今天咱们就好好聊聊这块。

25.1 多语言支持:不只是翻译字符串

虹膜识别涉及到很多提示文案,比如“请睁大眼睛”、“请靠近一些”、“识别失败,请重试”。这些字符串,你得放到 values 目录下。

Android 的多语言机制,说白了就是根据系统语言,自动加载对应 values-xx 文件夹里的资源。比如:

  • values/strings.xml —— 默认(通常是英文)
  • values-zh/strings.xml —— 简体中文
  • values-ja/strings.xml —— 日语

嗯,这里要注意:千万别在代码里硬编码提示文字。我见过有同事直接在 Toast 里写中文,结果海外用户反馈说“看不懂”。

正确做法:

// 错误示范
textView.setText("请睁大眼睛");

// 正确示范
textView.setText(getString(R.string.iris_prompt_open_eyes));

我个人习惯,在 strings.xml 里把所有虹膜相关的文案都加上 iris_ 前缀,方便管理。比如:

<string name="iris_prompt_open_eyes">Please open your eyes wide</string>
<string name="iris_prompt_move_closer">Move the phone closer</string>
<string name="iris_error_timeout">Recognition timed out. Please try again.</string>

中文版本就在 values-zh/strings.xml 里对应翻译:

<string name="iris_prompt_open_eyes">请睁大眼睛</string>
<string name="iris_prompt_move_closer">请将手机靠近一些</string>
<string name="iris_error_timeout">识别超时,请重试</string>

25.2 TalkBack 适配:让盲人也能用虹膜识别

TalkBack 是 Android 自带的屏幕阅读器。盲人用户通过触摸和语音反馈来操作手机。你的虹膜识别界面,必须让 TalkBack 能“读”出来。

我遇到过最典型的坑:自定义的预览界面,TalkBack 完全不读

为什么会这样?因为 SurfaceViewTextureView 默认没有内容描述。你需要手动给它们加上 contentDescription

适配要点:

  • 给所有可交互的控件(按钮、提示文字)加上 android:contentDescription
  • 对于“请将眼睛对准框内”这种提示,用 android:importantForAccessibility="yes" 强制朗读
  • 对于纯装饰性的元素(比如背景框),用 android:importantForAccessibility="no" 避免干扰

举个例子,你的“开始识别”按钮:

<Button
    android:id="@+id/btn_start_iris"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/iris_start"
    android:contentDescription="@string/iris_start_desc" />

strings.xml 里:

<string name="iris_start_desc">开始虹膜识别。双击以启动。</string>

另外,动态变化的提示也要通知 TalkBack。比如“识别成功”这种临时出现的文字,你需要用 announceForAccessibility() 方法主动播报。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    view.announceForAccessibility(getString(R.string.iris_success));
}

25.3 字体缩放兼容:别让文字飞出屏幕

有些用户喜欢把系统字体调到最大。你的虹膜识别界面,如果布局写死了 dp,文字就可能被截断,甚至重叠。

我曾经在测试机上看到过“请睁大眼睛”变成了“请睁大眼...”,后面直接省略号了。用户根本不知道要做什么。

解决方案:

  • 使用 sp 作为字体单位,它会跟随系统缩放
  • 布局使用 wrap_contentmatch_parent,不要写死宽度
  • 关键提示文字,用 maxLinesellipsize 控制溢出行为

注意: 虹膜识别的“对准框”区域,不要依赖文字位置来定位。因为字体缩放后,文字位置会变。我建议把对准框用 ConstraintLayout 的百分比或 Guideline 来固定位置。

举个例子,一个自适应的提示布局:

<TextView
    android:id="@+id/tv_iris_hint"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:maxLines="2"
    android:ellipsize="end"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@id/btn_start_iris" />

这样,就算字体放大到 200%,文字最多显示两行,超出部分用省略号,至少不会破坏布局。

25.4 知识体系总览

下面这张图,帮你把国际化与无障碍的核心逻辑串起来。你想想看,从多语言资源加载,到 TalkBack 事件分发,再到字体缩放适配,其实是一条线:让所有用户都能用

虹膜识别国际化与无障碍适配 多语言支持 TalkBack 适配 字体缩放兼容 values-xx 资源目录 strings.xml 统一管理 避免硬编码 contentDescription importantForAccessibility announceForAccessibility 使用 sp 单位 wrap_content 布局 maxLines 控制溢出 目标:所有用户,在任何语言、任何辅助设置下,都能完成虹膜识别

25.5 避坑指南

最后,分享几个我踩过的坑:

  • 我曾经在阿拉伯语环境下,发现虹膜识别的提示文字全部右对齐了,但我的布局是左对齐。后来才意识到,RTL(从右到左)布局需要单独适配。解决方案:用 startend 代替 leftright
  • 我曾经把 TalkBack 的焦点设置错了,导致用户双击“开始识别”时,触发的是“返回”按钮。嗯,这里要注意:focusableclickable 要正确设置。
  • 我记得有一次,用户把字体调到最大,结果“识别失败”四个字变成了两行,把“重试按钮”给挡住了。从那以后,我所有提示文字都加了 maxLines 限制。

国际化与无障碍,说白了就是“为所有人设计”。你多花一点心思,用户就能少一点困惑。尤其是虹膜识别这种对交互精度要求高的功能,更要考虑各种边缘情况。

小技巧: 测试时,把系统语言改成阿拉伯语、日语、德语,再把 TalkBack 打开,字体调到最大。走一遍完整的虹膜识别流程。你会发现很多平时注意不到的问题。


公众号:蓝海资料掘金营,微信deep3321