无障碍设计是现代化设计不可或缺的一个重要部分,因为它不仅能为现代社会中的残疾人士、老年人以及有特殊需要的人群提供方便,更能提高整体产品的容易使用性,为广大用户带来更好的用户体验。在 Android 应用中,无障碍设计也是至关重要的,但它在 Android 应用中的实现却依然面临着一些挑战。本文将深度探讨 Android 无障碍设计的实践,提供一些指导性的思路和示例代码,希望能为您的应用的无障碍设计提供帮助。
为何关注 Android 无障碍设计?
Android 是全球最流行的移动操作系统之一,它的用户群体非常庞大且多样化,其中包括很多需要无障碍设计要求的用户群体。这些群体不同于普通用户,他们的智力、身体能力或感觉能力都存在着不同程度的障碍,例如视力、听力、记忆力、语言障碍等等。如果不考虑这些群体的需求,那么就很有可能导致这些用户无法使用 Android 应用,降低他们的使用体验。
Android 无障碍设计的要点
要实现一个无障碍的 Android 应用,需要考虑以下要点:
1. 布局的有序性
无障碍设计的一个重要原则是布局的有序性。要让用户能够方便地找到他们需要的控件,按钮等等,应该按照自然的顺序存在,如阅读的顺序。对于那些需要使用辅助技术的用户,如屏幕阅读器等等,能够自然地理解应用。
2. 提供有意义的内容描述
在 Android 应用中,许多元素都需要功能提示符。这些提示符会告诉用户每个元素的目的和功能。一个好的功能提示符应该简明扼要,但能够充分地描述元素的意义和功能,同时,还应尽可能地避免使用专业词汇和简写等等,以便所有用户都能够理解。
3. 使用合理的颜色
无论在哪里,都有很多色盲或视网膜色素病变患者需要通过对比度的方式来感知色彩差异。因此,在 Android 应用中,应该使用高对比度的颜色,避免使用模糊或浅色调,同时也要遵循色盲友好的设计规则,确保应用在无障碍模式下使用不会带来任何困扰。
4. 辅助功能支持
安卓平台有一个访问性功能框架,可以支持无障碍操作的用户,开发者会用到一些类,例如 AccessibilityService 和 AccessibilityNodeInfo。开发者通过文本转语音及语音转文本的辅助功能,为使用者提供更好的服务,纳入受众群体,增加应用覆盖面。
一个实例
了解了 Android 无障碍设计原则,下面我们来模拟一个实例,假设我们正在开发一个聚会日程应用,对无障碍设计的需求有:
- 视力障碍者能够听到每个日程项的简介,而无需查看应用的屏幕
- 更大的文字大小,让老年人能够轻松地看清日程项
- 按钮具有明显的交互反馈,使轮廓轮显眼,以便用户找到它们
- 丰富的图标和配色,避免使用类似于红/绿色,这会导致色盲或其他视觉障碍的人无法使用应用
基于上述需求,我们需要按照以下步骤行动:
- 使用有序性布局:确保应用的各个页面和元素的布局都是按照自然的方式构建的。也就是说,他们应该按照阅读和视觉体验的方式存在。
- 提供有意义的文本和描述:确保所有文本和描述都与您的应用元素一致。比如,对于具有可重复性的日程单,可以使用“按天重复”而不是简单地粘贴 复制的方式。
- 使用合适的颜色:避免使用色盲颜色组合,并增加对比度。例如,使用浅绿色与白色的组合而不是深绿色和红色的组合。同时,使用阴影和轮廓可能会强调关键信息。
- 使用可用的辅助功能:允许用户使用音频合成器和语音识别器,使用缩放和字幕,以帮助他们使用应用。
示例代码
下面是一个简单的演示项目,其中包含一个用于安排聚会邀请者的主屏幕,该主屏幕以无障碍设计为目标。它可以让用户轻松地查看和听到与会者列表:
// javascriptcn.com code example // activity_main.xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="32sp" android:text="@string/app_name" android:layout_gravity="center_horizontal" android:padding="16dp" android:contentDescription="@string/app_description" /> <ListView android:id="@+id/attendees_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@color/divider_color" android:dividerHeight="2dp" android:paddingTop="8dp" android:paddingLeft="@dimen/list_horizontal_padding" android:paddingRight="@dimen/list_horizontal_padding" android:paddingBottom="8dp" android:layout_gravity="center" /> </LinearLayout> // MainActivity.java public class MainActivity extends AppCompatActivity { private static final String[] ATTENDEES = {"Alice", "Bob", "Charlie", "David", "Eve"}; private ArrayAdapter<String> attendeesAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView attendeesList = findViewById(R.id.attendees_list); // Sets the adapter that extends accessibility roles to each attendee. attendeesAdapter = new AttendeeAdapter(this, ATTENDEES); attendeesList.setAdapter(attendeesAdapter); } /** * An ArrayAdapter that extends accessibility event roles to each attendee. * <p> * Each AttendeeView is assigned an accessibility role via the {@link View#setAccessibilityDelegate}. */ private class AttendeeAdapter extends ArrayAdapter<String> { public AttendeeAdapter(Context context, String[] strings) { super(context, android.R.layout.simple_list_item_1, strings); } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view = super.getView(position, convertView, parent); AccessibilityDelegate delegate = new AccessibilityDelegate() { @Override public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { super.onInitializeAccessibilityEvent(host, event); String attendee = ((TextView) view).getText().toString(); event.getText().add(attendee); } @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); String attendee = ((TextView) view).getText().toString(); // Sets the class name for the type of node this represents, // like "textView" or "button". info.setClassName(TextView.class.getName()); // Sets the text content of the node. info.setText(attendee); // Sets the state of the node, such as "hasFocus". info.setStateDescription(attendee + " RSVP"); // Sets the description of the view, which is read aloud to the user. view.setContentDescription(attendee + " RSVP"); // Sets the content type for the description. view.setImportantForAccessibility( View.IMPORTANT_FOR_ACCESSIBILITY_YES); // Important for accessibility for visibility. view.setFocusable(true); view.setFocusableInTouchMode(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { view.setStateListAnimator(null); } } }; // Sets the delegate for each list item. view.setAccessibilityDelegate(delegate); return view; } } }
该示例应用包括一个列表,其中显示了参与者列表,并提供了可扩展性支持,包括辅助功能。例如,每个与会者都将自己作为一个可访问的角色委托给具有适当_ACCESSIBILITY_XXX_CONSTANTS的代理类,例如:android.view.accessibility.AccessibilityEvent
, android.view.accessibility.AccessibilityNodeInfo
, ANDROID_CONTENT_DESCRIPTION_XXX_CONSTANTS
and DESCRIPTIVE_XXX_CONSTANTS
。切记:应尽力充分描述应用中出现的所有视图和元素,而避免过于专业的语法和技术性常见的简写。在示例代码中,DESCRIPTIVE_XXX_CONSTANTS such as "clickable"、"password"、"radiobutton"等
, 当使用使用自定义视图时需要遵循同样的规则。
结论
Android 应用的无障碍设计实践已经逐渐成为重要的设计趋势,这既归功于其良好的用户体验,也归功于它充当现代应用的需求。无障碍设计的要点包括有序性布局、有意义的内容描述、使用合理的颜色、提供辅助功能支持等,并且它们在 Android 平台上的实现方式在一定程度上也决定了最终用户的体验。通过参考本文,您可以更好地理解和应用这些要点,设计更加用户友好和无障碍的 Android 应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6731867c0bc820c5823928dc