【React Native】文件翻譯閱讀紀錄 - 指南 - Accessibility(無障礙功能)
Facebook Open Source React Native |
Accessibility(無障礙功能)
原生應用程序輔助功能(iOS和Android)
iOS和Android都提供API,使殘疾人可以訪問應用程序。此外,這兩個平台都為視障人士提供捆綁式輔助技術,如屏幕閱讀器VoiceOver(iOS)和TalkBack(Android)。類似地,在React Native中我們有Included API,旨在為開發人員提供支持,使應用程序更易於訪問。請注意,iOS和Android的方法略有不同,因此React Native實現可能因平台而異。
除了本文檔之外,您可能會發現有關React Native可訪問性的博客文章非常有用。
除了本文檔之外,您可能會發現有關React Native可訪問性的博客文章非常有用。
使應用程序可訪問
輔助功能
無障礙 (iOS, Android)
如果為true,則表示視圖是輔助功能元素。當視圖是輔助功能元素時,它會將其子組合成一個可選擇的組件。默認情況下,所有可觸摸元素都可訪問。
在Android上,react-native View 的 accessible={true} 屬性將被轉換為 native focusable={true}。
<View accessible={true}>
<Text>text one</Text>
<Text>text two</Text>
</View>
在上面的示例中,我們無法單獨在“text one”和“text two”上獲得可訪問性焦點。相反,我們將焦點放在具有“可訪問”屬性的父視圖上。
accessibilityLabel (iOS, Android)
當視圖被標記為可訪問時,最好在視圖上設置accessibilityLabel,以便使用VoiceOver的人知道他們選擇了哪個元素。當用戶選擇關聯元素時,VoiceOver將讀取此字符串。
要使用,請將accessibilityLabel屬性設置為View上的自定義字符串:
要使用,請將accessibilityLabel屬性設置為View上的自定義字符串:
<TouchableOpacity
accessible={true}
accessibilityLabel={'Tap me!'}
onPress={this._onPress}>
<View style={styles.button}>
<Text style={styles.buttonText}>Press me!</Text>
</View>
</TouchableOpacity>
在上面的示例中,TouchableOpacity元素上的accessibilityLabel默認為“按我!”。標籤是通過連接由空格分隔的所有Text節點子節點構成的。
accessibilityTraits (iOS)
輔助功能特性告訴使用VoiceOver的人他們選擇了哪種元素。這個元素是標籤嗎?一個按鈕?標題?這些問題由accessibilityTraits回答。
要使用,請將accessibilityTraits屬性設置為可訪問性特徵字符串之一(或數組):
要使用,請將accessibilityTraits屬性設置為可訪問性特徵字符串之一(或數組):
- none 沒有特徵時使用。
- button 當元素應被視為按鈕時使用。
- link 當元素應被視為鏈接時使用。
- header 當元素充當內容部分的標題(例如導航欄的標題)時使用。
- search 當文本字段元素也應被視為搜索字段時使用。
- image 應將元素視為圖像時使用。例如,可以與按鈕或鏈接組合使用。
- selected 選擇元素時選擇使用。例如,表中的選定行或分段控件中的選定按鈕。
- plays 在元素激活時播放自己的聲音時使用。
- key 當元素充當鍵盤鍵時使用。
- text 應將元素視為無法更改的靜態文本時使用。
- summary 在應用程序首次啟動時,可以使用元素快速匯總應用程序中當前條件的摘要。例如,當Weather首次啟動時,具有今天天氣狀況的元素將標記為此特徵。
- disabled 在未啟用控件且未響應用戶輸入時使用。
- frequentUpdates 在元素頻繁更新其標籤或值時使用,但經常發送通知。允許輔助功能客戶端輪詢更改。秒錶就是一個例子。
- startsMedia 在激活元素時使用啟動媒體會話(例如播放電影,錄製音頻),該會話不應被輔助技術(如VoiceOver)的輸出中斷。
- adjustable 在可以“調整”元素時使用(例如滑塊)。
- allowsDirectInteraction 當元素允許VoiceOver用戶直接觸摸交互時使用(例如,表示鋼琴鍵盤的視圖)。
- pageTurn 通知 VoiceOver 在完成元素內容讀取後應滾動到下一頁。
accessibilityViewIsModal (iOS)
一個布爾值,指示VoiceOver是否應忽略作為接收器兄弟的視圖中的元素。
例如,在包含兄弟視圖A和B的窗口中,在視圖B上將accessibilityViewIsModal設置為true會導致VoiceOver忽略視圖A中的元素。另一方面,如果視圖B包含子視圖C並且您將accessibilityViewIsModal設置為在視圖C上為True,VoiceOver不會忽略視圖A中的元素。
例如,在包含兄弟視圖A和B的窗口中,在視圖B上將accessibilityViewIsModal設置為true會導致VoiceOver忽略視圖A中的元素。另一方面,如果視圖B包含子視圖C並且您將accessibilityViewIsModal設置為在視圖C上為True,VoiceOver不會忽略視圖A中的元素。
accessibilityElementsHidden (iOS)
一個布爾值,指示VoiceOver是否應忽略作為接收器兄弟的視圖中的元素。
例如,在包含兄弟視圖A和B的窗口中,在視圖B上將accessibilityViewIsModal設置為true會導致VoiceOver忽略視圖A中的元素。另一方面,如果視圖B包含子視圖C並且您將accessibilityViewIsModal設置為如果在視圖C上為true,則VoiceOver不會忽略視圖A中的元素。
例如,在包含兄弟視圖A和B的窗口中,在視圖B上將accessibilityViewIsModal設置為true會導致VoiceOver忽略視圖A中的元素。另一方面,如果視圖B包含子視圖C並且您將accessibilityViewIsModal設置為如果在視圖C上為true,則VoiceOver不會忽略視圖A中的元素。
onAccessibilityTap (iOS)
使用此屬性可以指定當某人通過在選中時雙擊它來激活可訪問元素時要調用的自定義函數。
onMagicTap (iOS)
將此屬性分配給自定義函數,當有人執行“魔術點擊”手勢時,將調用該函數,該手勢是兩個手指的雙擊。魔術點擊功能應該執行用戶可以對組件執行的最相關操作。在iPhone上的手機應用程序中,魔術點擊可接聽電話,或結束當前電話。如果所選元素沒有onMagicTap函數,則係統將遍歷視圖層次結構,直到找到可執行的視圖。
accessibilityComponentType (Android)
在某些情況下,我們還希望向最終用戶警告所選組件的類型(即,它是“按鈕”)。如果我們使用原生按鈕,這將自動運行。由於我們使用的是javascript,我們需要為TalkBack提供更多的上下文。為此,您必須為任何UI組件指定“accessibilityComponentType”屬性。我們支持'none','button','radiobutton_checked'和'radiobutton_unchecked'。
<TouchableWithoutFeedback accessibilityComponentType=”button”
onPress={this._onPress}>
<View style={styles.button}>
<Text style={styles.buttonText}>Press me!</Text>
</View>
</TouchableWithoutFeedback>
在上面的例子中,TouBbleWithoutFeedback正在被TalkBack宣佈為原生Button。
accessibilityLiveRegion (Android)
當組件動態變化時,我們希望TalkBack向最終用戶發出警報。這可以通過'accessibilityLiveRegion'屬性實現。它可以設置為'none','polite'和'assertive':
- none 輔助功能服務不應宣布對此視圖的更改。
- polite 輔助功能服務應宣布對此視圖的更改。
- assertive 無障礙服務應該中斷正在進行的語音,以立即宣布對該視圖的更改。
<TouchableWithoutFeedback onPress={this._addOne}>
<View style={styles.embedded}>
<Text>Click me</Text>
</View>
</TouchableWithoutFeedback>
<Text accessibilityLiveRegion="polite">
Clicked {this.state.count} times
</Text>
在上面的示例方法中,_addOne更改state.count變量。一旦最終用戶點擊TouchableWithoutFeedback,TalkBack就會在文本視圖中讀取文本,因為它的'accessibilityLiveRegion =“polite”'屬性。
importantForAccessibility (Android)
如果兩個重疊的UI組件具有相同的父組件,則默認的輔助功能焦點可能具有不可預測的行為。 'importantForAccessibility'屬性將通過控制視圖是否觸發可訪問性事件以及是否向可訪問性服務報告來解決此問題。它可以設置為“auto”,“yes”,“no”和“no-hide-descendants”(最後一個值將強制輔助功能服務忽略組件及其所有子組件)。
<View style={styles.container}>
<View style={{position: 'absolute', left: 10, top: 10, right: 10, height: 100,
backgroundColor: 'green'}} importantForAccessibility=”yes”>
<Text> First layout </Text>
</View>
<View style={{position: 'absolute', left: 10, top: 10, right: 10, height: 100,
backgroundColor: 'yellow'}} importantForAccessibility=”no-hide-descendants”>
<Text> Second layout </Text>
</View>
</View>
在上面的示例中,黃色佈局及其後代對於TalkBack和所有其他可訪問性服務是完全不可見的。因此,我們可以輕鬆地使用相同父級的重疊視圖,而不會混淆TalkBack。
檢查是否已啟用屏幕閱讀器
AccessibilityInfo API允許您確定屏幕閱讀器當前是否處於活動狀態。有關詳細信息,請參閱AccessibilityInfo文檔。
發送輔助功能事件 (Android)
有時,在UI組件上觸發輔助功能事件很有用(即,當屏幕上顯示自定義視圖或選擇了自定義單選按鈕時)。本機UIManager模塊為此目的公開了一個方法 'sendAccessibilityEvent'。它需要兩個參數:視圖標記和事件類型。
import { UIManager, findNodeHandle } from 'react-native';
_onPress: function() {
const radioButton = this.state.radioButton === 'radiobutton_checked' ?
'radiobutton_unchecked' : 'radiobutton_checked'
this.setState({
radioButton: radioButton
});
if (radioButton === 'radiobutton_checked') {
UIManager.sendAccessibilityEvent(
findNodeHandle(this),
UIManager.AccessibilityEventTypes.typeViewClicked);
}
}
<CustomRadioButton
accessibleComponentType={this.state.radioButton}
onPress={this._onPress}/>
在上面的例子中,我們創建了一個自定義單選按鈕,現在的行為類似於本機按鈕。 更具體地說,TalkBack現在正確地宣布對單選按鈕選擇的更改。
測試VoiceOver支持(iOS)
要啟用VoiceOver,請轉到iOS設備上的“設置”應用。 點按常規,然後點按輔助功能。 在那裡,您會發現許多人們用來使設備更加可用的工具,例如更大膽的文本,更高的對比度和VoiceOver。
要啟用VoiceOver,請點擊“Vision”下的VoiceOver並切換顯示在頂部的開關。
在輔助功能設置的最底部,有一個“輔助功能快捷方式”。 您可以通過三次單擊“主頁”按鈕來使用此功能切換VoiceOver。
要啟用VoiceOver,請點擊“Vision”下的VoiceOver並切換顯示在頂部的開關。
在輔助功能設置的最底部,有一個“輔助功能快捷方式”。 您可以通過三次單擊“主頁”按鈕來使用此功能切換VoiceOver。
0 意見