zhou123 发表于 2021-9-11 05:08:23

Android无障碍应用开发铁规12条

为了让包括残障人士、老年人在内的所有人都能无障碍的使用Android应用,在开发应用的过程中应当遵循一些原则,以下讲解几个我们在为一些大厂APP提供无障碍支持时常遇到的问题,只要解决以下12条铁规,那你的应用虽说达不到易用,但至少是可用的。对于后续全面无障碍化也只需投入很小的成本即可实现。
1   Android设计无障碍指南
在创建布局前,复查和遵守Android设计指南中提供的无障碍方案。让你的Android应用界面布局满足无障碍设计指南。2   框架提供的控件
尽可能使用Android标准用户界面控件,这些控件默认提供无障碍支持,如Button(按钮)、EditText(编辑框)等。3   描述用户界面控件
为没有视觉文本的用户界面组件提供内容描述,特别是图像按钮(ImageButton),图像视图(ImageView)和复选框(CheckBox)组件。使用XML布局属性android:contentDescription或在代码中使用setContentDescription(CharSequence)方法来为无障碍服务提供内容描述。当无障碍服务访问到提供了内容描述的非文本控件时会把内容描述属性报告给用户,例如屏幕阅读器会使用TTS把内容描述文本转换成语音朗读给视障用户,从而让视障用户也能“看”到图形控件。
提示:内容描述属性不会显示在屏幕上,不会影响用户界面。







上图中框柱的头像钮没有添加内容描述,屏幕阅读器朗读为“未加标签按钮”,用户无法知道控件的作用。





   上面的微信朋友圈发表按钮有添加内容描述,用户能通过这个描述知道控件的作用。

注意:
1)装饰性控件(纯粹的装饰没有提供任何内容也没有功能的控件)不应该提供内容描述。装饰性控件提供内容描述会影响用户的浏览效率。另外文本框(EditText)控件不应该提供内容描述属性,应该使用hint属性给用户提供提示语,当编辑框内没有内容时hint属性会已灰色显示,让用户知道应该输入什么内容。
2)当控件中使用的是图像文本时,也应该提供内容描述,且内容描述尽量与显示的图像文本一致。图像文本就是使用文本生成的图片,例如有文字“HelloWorld!”,通过图像工具生成为图片并作为一个按钮的显示内容。
3)现在一些APP中的按钮(Button)、文本框(TextView)使用一些符号作为显示内容,如箭头符号。这时候最好也为控件添加内容描述属性,因为很多特殊的符号屏幕阅读器无法朗读,用户就无法知道控件的作用。

下面用代码展示如何添加内容描述:
<ImageButton
android:layout_width=“match_parent”
android:layout_height=“30dp”
android:layout_margin=“5dp”
android:src=“@drawable/search_icon”
android:contentDescription=“搜索”/>

如果用户在正常使用应用的过程中,应用中的按钮或其他控件的功能会发生改变(例如,一个按钮从播放变为暂停),保证按钮的android:contentDescription会相应改变。下面演示如何在代码中改变内容描述属性:
ButtonplayButton=(Button)findViewById(R.id.play_button);
playButton.setContentDescription(“暂停”);
4   保证基于焦点的导航
保证用户在使用基于硬件或软件定向控制(D-pads,轨迹球,键盘和导航手势)时,可以导航屏幕布局。在一些情况下,需要保证用户界面可聚焦,或者改变焦点顺序使用户交互更具逻辑性。要让控件可聚焦需要把控件的android:focusable和android:focusableInTouchMode属性设置为true。如果一个可操作的控件元素无法通过定向导航聚焦到,通过定向导航访问用户界面的用户就无法使用这些控件的功能,例如键盘用户、屏幕阅读器用户等。

上面的日期选择,日和小时都可以选择,但是两个是一个焦点,屏幕阅读器用户无法选择。
下面为没有焦点的自定义视图(CustomView)添加焦点:
<CustomView
android:layout_width=“match_parent”
android:layout_height=“50dp”
android:layout_margin=“10dp”
android:focusable=“true”
android:focusableInTouchMode=“true”/>
如果想改变焦点顺序可以通过android:nextFocusUPandroid:nextFocusDownandroid:nextFocusLeftandroid:nextFocusRight这一组属性来完成,如果想改变无障碍焦点的焦点顺序可以通过android:accessibilityTraversalBefore和android:accessibilityTraversalAfter属性来完成。下面的布局修改了焦点顺序,修改之后的焦点顺序是先访问到“Hello”后访问到World”:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width=“wrap_content"
android:layout_height=“wrap_content”
android:layout_margin=“10dp”
android:text=“Hello"
android:id="@+id/hello"
android:layout_centerInParent="true"
android:accessibilityTraversalBefore="@+id/world"/>

<TextView
android:layout_width=“wrap_content"
android:layout_height=“wrap_content”
android:layout_margin=“10dp”
android:text=“World"
android:id="@+id/world"
android:layout_above="@id/hello"/>

</RelativeLayout>
5   纯音频反馈替代
音频反馈必须有第二种反馈机制来支持听障用户的使用。例如,消息铃声作为系统通知必须伴随震动反馈(如果可能的话)或其他视觉警告,如灯光闪烁。语音通话的通知不应该仅提供声音提示,还应该提供震动反馈、LED灯光闪烁,听障用户才能通过震动和灯光知道有语音通话。6   视频播放和字幕
如果应用程序提供视频播放,必须为聋人和重听用户提供字幕和注释来帮助他们理解。视频播放控件必须明确说明字幕是否可用,并提供简单的方式启用字幕。7   自定义视图控件
如果为应用程序创建了自定义界面控件,为自定义视图实现无障碍接口并提供内容描述。对于需要与android最低版本1.6保持一致性的自定义控件,使用支持库(SupportLibrary)实现最新的无障碍特性。自定义控件可以通过onInitializeAccessibilityEvent()和onInitializeAccessibilityNodeInfo()两个方法设置控件类型、状态等无障碍属性。下面的代码简单演示自定义视图添加无障碍朗读文本:
publicclassCustomViewextendsView{

...

@Override
publicvoidonInitializeAccessibilityEvent(AccessibilityEventevent){
super.onInitializeAccessibilityEvent(event);

//获取当前显示的文本
Stringtext=getDisplayText();
//设置内容描述
if(text.length()>0){
event.getText().add(text);
}
}

@Override
publicvoidonInitializeAccessibilityNodeInfo(AccessibilityNodeInfoinfo){
super.onInitializeAccessibilityNodeInfo(info);

//获取显示的文本
Stringtext=getDisplayText();
//设置内容描述属性
if(text.length()>0){
info.setText(text);
info.setContentDescription(text);
}

}


//通过此方法获取当前显示的文本内容
privateStringgetDisplayText(){
...
}

}
8   自定义点击处理
如果应用中的控件操作手势特殊,例如使用onTouchEvent(MotionEvent)监听MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP,并作为点击事件对待,开发者必须触发一个等效于点击的AccessibilityEvent,可以通过sendAccessibilityEvent()方法发送无障碍事件,并为用户无障碍服务提供一种方式模拟执行这项操作。例如调用performClick()方法模拟点击或通过performAccessibilityAction()方法模拟其他操作。9   高视觉或复杂视觉交互的自定义控件
如果应用程序中包含具有高视觉特性的自定义控件(例如日历控件),或提供复杂或非标准视觉交互的自定义控件,默认无障碍服务处理不会为用户提供充足的内容描述或用户很难操作控件,使用AccessibilityNodeProvider为自定义控件提供虚拟视图层次,AccessibilityNodeProvider允许无障碍服务为用户提供简化交互模型、提供足够的信息。如果要在低版本中使用虚拟视图可以使用支持库中的ExploreByTouchHelper创建虚拟视图。如果该方式不可行,考虑提供一个无障碍的替代视图。10临时或自我隐藏控件和通知
避免使用一段时间之后,变暗或消失的用户界面控件。如果该功能对应用很重要,为该功能提供一个替代的交互方式。例如视频播放时,一段时间会隐藏的操作控制,应该提供一直存在的操作,如提供操作菜单。



上面的短视频展示了视频播放时操作工具条一段时间消失的情况

11控件大小和小控件组
无障碍标准中对控件的最小尺寸有要求,要求不小鱼48dp,我们可以通过android:minWidth和android:minHeight属性设置最小宽度和最小高度。如果传递相关联信息的控件组中的控件比推荐的触摸尺寸小,可以考虑使用ViewGroup将这些控件组合起来,并使用android:contentDescription为该组合提供内容描述。

12测试
使用定向控制导航浏览android应用,和使用TalkBack提供的非视觉导航来测试无障碍性能。




扫码关注无障碍实验室,研究探索用户体验的极致!

文|一同信息科技
视屏、图片|转载自网络

只要有平等的机会,
       就会有超越的可能。
本帖来自安卓秘书

失败的饶舌者 发表于 2021-9-11 05:13:05

有沙发吗
本帖来自安卓秘书

朗朗乾坤 发表于 2021-9-11 06:37:27

人家不懈看。一分钟都是浪费生命。
本帖来自安卓秘书

时光 发表于 2021-9-11 06:54:33

回复楼主zhou123

这是哪里转过来的,说的很详细啊,要是都能照这个来,在前期就打好基础,后面就算有些遗漏要更改起来也变得不在那么难了,可惜很多厂商有的一开始由于使用自会控件等原因,这些东西都扔到了爪哇国,等到要更改的时候,啊啊,累死啦,算了,我们无法做到,xxxxxx,所以说,爱
本帖来自微秘

zhhr 发表于 2021-9-11 19:03:20

这个说的还是比较详细的
本帖来自安卓秘书
页: [1]
查看完整版本: Android无障碍应用开发铁规12条