阿里妹导读:目前中国有 1700 多万视障人士,在互联网发达的今天,他们无法像大部分人一样享受到互联网带来的便利,比如用手机网购。不过我们可以通过技术来改善这一现状,最大程度地让他们的生活更加便捷。本文分享手淘在使用 DinamicX 支持无障碍上的技术方案,并给出了相关示例,希望对移动端开发者有所启发。
文末福利:Git 快速上手公开课。
开车的时候试图用手机:汽车晃动导致情境性的视觉障碍、肢体障碍、注意力障碍。
开会时聊天软件发来语音:查看消息发出声音会影响周围同事(聊天软件提供语音转文字的功能便是无障碍的一种)。
出国旅游语言不通:情境性的口头沟通障碍。
买东西时拎着大包小包:情境性的肢体障碍。
无障碍的新定义:确保每个用户意图都被理解。
SDK 本身对无障碍的跨平台支持
模板开发平台进行卡口校验
View 设置了 isAccessibilityElement=YES,无论是否设置了 accesibilityLabel,所有它的子节点,都不可获得焦点。
UILabel 的 isAccessibilityElement 属性默认是 NO,但只要主动地设置过值,就算设置的是 NO,也无法在父容器下自动读出。
如果需要父容器获得焦点后自动读取出里面所有 UILabel 的文字,需要 isAccessibilityElement = NO,并且 accessibilityElementsHidden = NO。Label 的 isAccessibilityElement 必须保持原始默认值,不能设置任何值。
如果父节点嵌套,并且所有父节点的 accessibilityElement 都设置为 off,会自动将这个父节点所有的子节点的 TextView 的 accessibilityLabel 顺序读出,这意味着所有自动阅读的文字最终都在根节点上被读出。
没有无障碍信息,如 ImageView、View 等默认就是没有无障碍信息。
有无障碍信息,如 ImageView 设置 setContentDescription,或者 TextView 自带无障碍信息就是它本身的 text。
有无障碍信息的可交互控件,比如 ImageView 设置 setContentDescription 的同时,又设置了 setOnClickListener, 比如 TextView 设置了setFocusable(true),或者 EditText、CheckBox 这种默认就是有无障碍信息的可交互控件。
<ImageView
width="100"
height="100"
accessibility="on"
accessibilityText="跳往详情页"
onTap="@openUrl{'detail'}"
imageUrl="https://img.alicdn.com/tfs/TB1FuMQQFXXXXXLXXXXXXXXXXXX-420-420.jpg"
/>
<LinearLayout
backgroundColor="#eeeeee"
height="match_content"
width="375"
orientation="vertical"
disableFlatten="true"
>
<LinearLayout
marginLeft="@triple{@data{cellType},20,50}"
backgroundColor="#f2f2f2"
height="match_content"
width="match_parent"
orientation="vertical"
disableFlatten="true"
accessibility="auto"
>
<!--auto代表点击的时候,该layout下面的text信息都可以读出来-->
<TextView
width="match_content"
height="match_content"
textColor="#ff051b28"
textSize="12"
marginTop="20"
marginBottom="20"
text="这是一个textView"
/>
<TextView
width="match_content"
height="match_content"
textColor="#ff051b28"
textSize="12"
marginTop="20"
marginBottom="20"
text="这是一个有焦点的textView"
accessibility="on"
onTap="@rTap{}"
accessibilityText="这是一个有焦点的textView"
/>
<FastTextView
width="match_content"
height="match_content"
textColor="#ff051b28"
textSize="12"
marginTop="20"
marginBottom="20"
text="这是一个FastTextView"
/>
<TextView
width="match_content"
height="match_content"
textColor="#ff051b28"
textSize="12"
marginTop="20"
marginBottom="20"
accessibility="off"
text="这是一个不需要被朗读的textView"
/>
<ImageView
width="100"
height="100"
marginLeft="20"
marginTop="12"
borderWidth="3ap"
borderColor="#FF0000"
accessibility="on"
accessibilityText="这是一个ImageView点击"
onTap="@rTap{'测试'}"
imageUrl="https://img.alicdn.com/tfs/TB1FuMQQFXXXXXLXXXXXXXXXXXX-420-420.jpg"
/>
</LinearLayout>
</LinearLayout>
第一,无障碍的公益宣导不够,优先级不高,开发本身没有这个意识,无障碍测试用例缺失。
第二,无障碍功能的支持有一定的成本,且没有一套标准和规范告知什么情况下需要无障碍,且如何支持。
第三,流程上没有监督和管控,开发有可能会忘记。
非交互性控件,如 ImageView、FrameLayout、LinearLayout 等,若有设置 onTap 属性,则会检查是否含有无障碍属性,若没有则校验不通过,并给出建议:需要设置accessibility=on, 开启无障碍焦点,同时设置 accessibilityText= xx 属性。
非交互性控件,如 ImageView、FrameLayout、LinearLayout 等,若有设置 accessibility=on 的时候,必须同时设置 accessibilityText=xx。
子 View 设置 onTap 属性的时候,必须保证它的父 Layout 没有设置 accessibility=on,否则该子 View 是不能获取焦点的。
如果 Layout 设置了 auto 属性,TextView 不能只设置 onTap,还要设置 accessibility=on,否则获取不到焦点。
accessibility 属性不能设置动态表达式。
推荐阅读