정부에서 시행한 모바일 앱 접근성 준수 지침이 의무화 되었습니다.
혹시 여러분들은 개발하실 때, 접근성을 고려하고 계시나요?
접근성에 대해 가볍게 알아보고, 향상시키는 기술적 방안들을 소개합니다.
이번 기회에 모든 사용자가 쉽게 사용할 수 있는 앱을 만드는 방법을 함께 배워봅시다!
아닌 32dp x 32dp 를 권장하는 이유는 ? // TouchTargetSizeCheck.kt /** * Minimum height and width are set according to * <a href="http://developer.android.com/design/patterns/accessibility.html"></a> * With the modification that targets against the edge of the screen may be narrower. */ private static final int TOUCH_TARGET_MIN_HEIGHT = 48; private static final int TOUCH_TARGET_MIN_WIDTH = 48; private static final int TOUCH_TARGET_MIN_HEIGHT_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_WIDTH_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_HEIGHT_IME_CONTAINER = 32; private static final int TOUCH_TARGET_MIN_WIDTH_IME_CONTAINER = 32;
아닌 32dp x 32dp 를 권장하는 이유는 ? // TouchTargetSizeCheck.kt /** * Minimum height and width are set according to * <a href="http://developer.android.com/design/patterns/accessibility.html"></a> * With the modification that targets against the edge of the screen may be narrower. */ private static final int TOUCH_TARGET_MIN_HEIGHT = 48; private static final int TOUCH_TARGET_MIN_WIDTH = 48; private static final int TOUCH_TARGET_MIN_HEIGHT_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_WIDTH_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_HEIGHT_IME_CONTAINER = 32; private static final int TOUCH_TARGET_MIN_WIDTH_IME_CONTAINER = 32;
아닌 32dp x 32dp 를 권장하는 이유는 ? // TouchTargetSizeCheck.kt /** * Minimum height and width are set according to * <a href="http://developer.android.com/design/patterns/accessibility.html"></a> * With the modification that targets against the edge of the screen may be narrower. */ private static final int TOUCH_TARGET_MIN_HEIGHT = 48; private static final int TOUCH_TARGET_MIN_WIDTH = 48; private static final int TOUCH_TARGET_MIN_HEIGHT_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_WIDTH_ON_EDGE = 32; private static final int TOUCH_TARGET_MIN_HEIGHT_IME_CONTAINER = 32; private static final int TOUCH_TARGET_MIN_WIDTH_IME_CONTAINER = 32;
Int) { // 1. 부모 뷰를 가져와요 val parent = this.parent as? View parent?.touchDelegate = TouchDelegate( Rect().apply { // 2. 현재 뷰의 터치 영역을 가져와요 getHitRect(this) // 3. inset 함수를 사용하여 터치 영역을 확장해요 inset(size, size) }, this ) }
Int) { // 1. 부모 뷰를 가져와요 val parent = this.parent as? View parent?.touchDelegate = TouchDelegate( Rect().apply { // 2. 현재 뷰의 터치 영역을 가져와요 getHitRect(this) // 3. inset 함수를 사용하여 터치 영역을 확장해요 inset(size, size) }, this ) }
Int) { // 1. 부모 뷰를 가져와요 val parent = this.parent as? View parent?.touchDelegate = TouchDelegate( Rect().apply { // 2. 현재 뷰의 터치 영역을 가져와요 getHitRect(this) // 3. inset 함수를 사용하여 터치 영역을 확장해요 inset(size, size) }, this ) }
MeasureResult { val size = minimumInteractiveComponentSize val placeable = measurable.measure(constraints) val enforcement = isAttached && currentValueOf(LocalMinimumInteractiveComponentEnforcement) // 코드 생략… } 더 큰 터치 영역
MeasureResult { val size = minimumInteractiveComponentSize val placeable = measurable.measure(constraints) val enforcement = isAttached && currentValueOf(LocalMinimumInteractiveComponentEnforcement) // 코드 생략… } private val minimumInteractiveComponentSize: DpSize = DpSize(48.dp, 48.dp) 더 큰 터치 영역
// EditText 의 ID 입력 android:text="비밀번호" /> <com.google.android.material.textfield.TextInputEditText android:id="@+id/password_input" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="특수문자 포함 적어도 8자 이상" android:inputType="textPassword" /> </merge>
super.onInitializeAccessibilityNodeInfo(info) info?.addAction(ACTION_SET_PROGRESS) // Progress 와 연관 있는 Action 을 설정해요 val rangeInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { AccessibilityNodeInfo.RangeInfo( AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_FLOAT, min, max, value ) } else { AccessibilityNodeInfo.RangeInfo.obtain( AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_FLOAT, min, max, value ) } // Progress 의 min, max 그리고 현재 값을 설정해요 info?.rangeInfo = rangeInfo }
알아봤어요 ❏ 접근성 가이드라인에는 텍스트 가시성 향상, 더 큰 터치 영역 사용, UI 요소 설명이 있어요 ❏ 접근성 검사 도구로는 Accessibility Scanner, Espresso 테스트가 있어요 ❏ 발생할 수 있는 문제는 커스텀 뷰의 접근성 처리, Grouping, LiveRegion 관련 문제가 있어요