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 完全不读。
为什么会这样?因为 SurfaceView 或 TextureView 默认没有内容描述。你需要手动给它们加上 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_content或match_parent,不要写死宽度 - 关键提示文字,用
maxLines和ellipsize控制溢出行为
注意: 虹膜识别的“对准框”区域,不要依赖文字位置来定位。因为字体缩放后,文字位置会变。我建议把对准框用 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 事件分发,再到字体缩放适配,其实是一条线:让所有用户都能用。
25.5 避坑指南
最后,分享几个我踩过的坑:
- 我曾经在阿拉伯语环境下,发现虹膜识别的提示文字全部右对齐了,但我的布局是左对齐。后来才意识到,RTL(从右到左)布局需要单独适配。解决方案:用
start和end代替left和right。 - 我曾经把 TalkBack 的焦点设置错了,导致用户双击“开始识别”时,触发的是“返回”按钮。嗯,这里要注意:
focusable和clickable要正确设置。 - 我记得有一次,用户把字体调到最大,结果“识别失败”四个字变成了两行,把“重试按钮”给挡住了。从那以后,我所有提示文字都加了
maxLines限制。
国际化与无障碍,说白了就是“为所有人设计”。你多花一点心思,用户就能少一点困惑。尤其是虹膜识别这种对交互精度要求高的功能,更要考虑各种边缘情况。
小技巧: 测试时,把系统语言改成阿拉伯语、日语、德语,再把 TalkBack 打开,字体调到最大。走一遍完整的虹膜识别流程。你会发现很多平时注意不到的问题。
公众号:蓝海资料掘金营,微信deep3321