中国目前有超过1700万视障人士。在互联网发达的今天,他们不能像大多数人一样享受互联网带来的便利,比如用手机上网购物。但是,我们可以通过技术来改善这种情况,最大程度的让他们的生活更加便利。本文分享了手机淘宝在使用DinamicX支持无障碍方面的技术方案,并给出了相关示例,希望对移动开发者有所启发。什么是无障碍?无障碍的范围很广,一般是指发展过程中没有障碍,活动可以顺利进行。比如在火车站、机场、商场等一些公共场所为腿脚残障人士设置无障碍电梯、无障碍厕所,或者为听力障碍人士提供助听器等。换句话说:为残疾人提供与非残疾人相同的机会。这里提到的残疾在形式和严重程度上各不相同,但分为四大类:认知、视觉、听觉和行动能力。当然,残疾也分为永久性残疾和情境性残疾两种。永久性残疾视力障碍、听力障碍、坐轮椅或行动不便等身体障碍。情境障碍驾驶时尝试使用手机:由于汽车晃动导致的情境视觉障碍、身体障碍和注意力缺陷。会议中聊天软件的声音:查看消息发出声音会影响到周围的同事(聊天软件提供的语音转文字功能是一种无障碍)。出国旅行时的语言障碍:情境口头交流障碍。购物时提包:情境性身体损伤。可访问性的新定义:确保理解每个用户意图。从某种程度上说,信息无障碍是智能产品交互设计中针对特殊人群的功能,让人们在硬件和软件上更平等地享受产品的功能。DinamiX对无障碍的支持下面文章中DinamicX对无障碍的支持主要是信息无障碍,一般是针对有视觉障碍的人。通过技术手段,帮助视障人士更好地体验世界的美好,让用户在使用APP时能够顺畅地获取和使用信息。手机淘宝基础核心链接手机淘宝首页、详情、购物车、订单、订单、订单列表、我的淘宝均属于手机淘宝核心链接。目前,上述页面的UI是使用DinamicX作为渲染引擎绘制的。DinamicXSDK是支撑手淘基础核心环节的重要组成部分,支撑无障碍是责无旁贷的。关于DinamicXDinamicX的定位是提供三端统一能力的客户端动态解决方案,为无线基础链路的高性能和高可用性提供基础保障。我们希望通过社区化运营,不断丰富DinamicX的能力和内容,提升渲染性能和稳定性,使DinamicX成为集团内客户端动态系统的标准化解决方案。动态模板解决方案核心技术:包含模板下载、加载、解析、渲染的引擎,帮你动态生成View。DinamicX对无障碍的支持主要分为两部分:SDK本身在无障碍跨平台支持模板开发平台上进行checkpoint验证。业务方(模板开发人员)希望支持可访问性的认知成本。我们团队的所有成员,包括Android开发、iOS开发、测试同学,经过长时间的讨论,确保两端统一,勾勒出一个统一的无障碍行为。技术方案System-nativeaccessibilityiOSsystem-nativeaccessibilitynativeiOS的几种逻辑:View设置isAccessibilityElement=YES,无论是否设置accessibilityLabel,其所有子节点都无法获得焦点。UILabel的isAccessibilityElement属性默认为NO,但只要主动设置该值,即使设置为NO,在父容器下也无法自动读取。如果需要父容器获得焦点后自动读取里面所有UILabel的文本,需要isAccessibilityElement=NO,accessibilityElementsHidden=NO。Label的isAccessibilityElement必须保持原来的默认值,不能设置为任何值。如果父节点是嵌套的,并且所有父节点的accessibilityElement都设置为off,则父节点所有子节点的TextView的accessibilityLabel会自动依次读取,也就是说所有自动读取的文本最终都会被read在根节点上读出。系统辅助功能API:Android系统的原生辅助功能。AndroidView的无障碍状态分为三种:Noaccessibilityinformation,比如ImageView、View等,默认是没有无障碍信息的。有无障碍信息,比如ImageView设置setContentDescription,或者TextView自己的无障碍信息就是自己的文字。带有辅助信息的交互控件,比如ImageView同时设置setContentDescription和setOnClickListener,比如TextView设置setFocusable(true),或者EditText和CheckBox默认是带有辅助信息的交互控件。这三种无障碍状态在其父布局中的关系:SystemAccessibilityAPI:DinamicXSDK定义了无障碍属性,以消除两端的差异并简化无障碍逻辑。DinamicX提供了两个辅助功能属性来支持辅助功能。xml示例如下,表示当控件被触摸时,会被选中,并读出“跳转到详情页”的文案:
