Slide 1

Slide 1 text

Flutter製アプリの アクセシビリティ対応 (音声読み上げ編) 2019.09.06 Flutter Meetup Tokyo #11 @nano2_aloerina

Slide 2

Slide 2 text

誰? ● 坂野 匠弥 / なのなの ● 株式会社アスネット 技術部 開発グループ所属 ● 業務は主にAndroidアプリエンジニア ● Flutter歴: だらだらと約1年 ● Twitter: @nano2_aloerina / GitHub: nano-nano 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

日本でもFlutter製アプリが 増えてきた! 5

Slide 6

Slide 6 text

アプリを多くの人に 使ってもらいたい! 6

Slide 7

Slide 7 text

アプリを多くの人に使ってもらうには? ● 使いやすいUIUX ● 多言語対応 ● アクセシビリティ対応 7

Slide 8

Slide 8 text

アプリを多くの人に使ってもらうには? ● 使いやすいUIUX ● 多言語対応 ● アクセシビリティ対応 8

Slide 9

Slide 9 text

アクセシビリティ ● ハンディキャップを持った人でもモバイル端末を使えるように、端末操作を補 助する機能群 ● 例えばAndroid Developersのドキュメントには、アクセシビリティ対応を行う ことで「より多くのユーザーにアプリがリーチできる」とある ( https://developer.android.com/guide/topics/ui/accessibility#impact ) 9

Slide 10

Slide 10 text

アクセシビリティ機能 ● Android: 設定>ユーザー補助 ● iOS: 設定>一般>アクセシビリティ 10

Slide 11

Slide 11 text

主なアクセシビリティ機能 ● 拡大操作・ズーム ● フォントサイズ ● スイッチコントロール ● モノラル再生 ● 音声読み上げ ● etc. 11

Slide 12

Slide 12 text

主なアクセシビリティ機能 ● 拡大操作・ズーム ● フォントサイズ ● スイッチコントロール ● モノラル再生 ● 音声読み上げ ● etc. 12

Slide 13

Slide 13 text

主なアクセシビリティ機能 ● 拡大操作・ズーム ● フォントサイズ ● スイッチコントロール ● モノラル再生 ● 音声読み上げ ● etc. Android: TalkBack iOS: VoiceOver 13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

そもそも Flutter製アプリは 読み上げてくれるのか? 15

Slide 16

Slide 16 text

Demo (Flutter製アプリの 読み上げ確認) 16

Slide 17

Slide 17 text

自分で読み上げ方を制御したいこともある ふらったんの 画像 ボタン 17

Slide 18

Slide 18 text

ケーススタディ: 画像に読み上げテキストを設定 Image.asset( 'assets/flattan.png', height: 400, ) Image.asset( 'assets/flattan.png', height: 400, semanticLabel: 'ふらったんの画像', ) 18

Slide 19

Slide 19 text

ケーススタディ: 特定のパーツを読み上げさせない RaisedButton( onPressed: _incrementCounter, child: Text('Push Me!!'), ) Semantics( child: RaisedButton( onPressed: _incrementCounter, child: Text('Push Me!!'), ), excludeSemantics: true, ), 19

Slide 20

Slide 20 text

Semantics widget 20

Slide 21

Slide 21 text

21

Slide 22

Slide 22 text

Semantics widgetの主なコンストラクタ引数 ● label ○ 子ウィジェットの説明。読み上げ機能で読み上げられるテキストにな る ● excludeSemantics ○ 子ウィジェットに読み上げ機能のカーソルが当たらないようにするか どうか。trueで当たらない(=読み上げられない) ● sortKey ○ 子ウィジェットに読み上げ機能のカーソルが当たる順番。 22

Slide 23

Slide 23 text

SortKeyについて Semantics( child: Text('Accesibility Text'), sortKey: OrdinalSortKey(2.0), ), Semantics( child: Text('Accesibility Text-2'), sortKey: OrdinalSortKey(1.0), ), 23

Slide 24

Slide 24 text

ケーススタディ: 好きなタイミングで読み上げたい カウントアップ しました 24

Slide 25

Slide 25 text

ケーススタディ: 好きなタイミングで読み上げたい void _incrementCounter() { setState(() { _counter++; }); SemanticsService.announce('カウントアップしました', TextDirection.ltr); } 25

Slide 26

Slide 26 text

Demo (SemanticsService) 26

Slide 27

Slide 27 text

まとめ ● アプリをより多くの人に使ってもらうためには、音声読み上げなどアクセシ ビリティ対応が重要である ● Flutter製アプリは、デフォルトで音声読み上げ機能に対応した形になって いる ● 足りない部分はSemantics widgetなどを利用することで、ある程度の制御 が可能である 27

Slide 28

Slide 28 text

まとめ ● アプリをより多くの人に使ってもらうためには、音声読み上げなどアクセシ ビリティ対応が重要である ● Flutter製アプリは、デフォルトで音声読み上げ機能に対応した形になって いる ● 足りない部分はSemantics widgetなどを利用することで、ある程度の制御 が可能である 結論: アクセシビリティ対応やっていき! 28

Slide 29

Slide 29 text

Appendix. 参考文献等 Accessibility - Flutter https://flutter.dev/docs/development/accessibility-and-localization/accessibility semantics library - Dart API https://api.flutter.dev/flutter/semantics/semantics-library.html Accessibility on Flutter - Carlos Macías Martín - Medium https://medium.com/@c4rlosmm96/accessibility-on-flutter-908a2f003013 A deep dive into Flutter’s accessibility widgets - Flutter Community - Medium https://medium.com/flutter-community/a-deep-dive-into-flutters-accessibility-widgets-eb0ef9455bc 29

Slide 30

Slide 30 text

Appendix. 参考文献等 30 Google Devs Japanのツイート https://twitter.com/googledevjp/status/116733931 9276605440 Semantics (Flutter Widget of the Week) https://youtu.be/NvtMt_DtFrQ

Slide 31

Slide 31 text

Appendix. 音声読み上げ機能のON/OFF確認 accessibility - How to check whether screen reader is on using Flutter - Stack Overflow https://stackoverflow.com/questions/54224069/how-to-check-whether-screen-reader-is-on-using-flutter MediaQuery.of(context).accessibleNavigation で判断できる (trueのとき、音声読み上げ機能がONになっている) Visibility( child: Placeholder(), visible: MediaQuery.of(context).accessibleNavigation, ) 音声読み上げ機能がONの場合、 Placeholder widgetを表示させない という実装例 31

Slide 32

Slide 32 text

Thank You!! 32