본문 바로가기

App Accessibility

linkageLab x kakao

검사항목 2.2 단순한 누르기 동작 지원

터치 기반 모바일 기기의 모든 기능은 단순한 누르기 동작(touch or tab)으로 이용할 수 있어야 한다.

필요성

손가락의 움직임이 자유롭지 않은 상지 장애인은 다중 누르기(Multi-touch) 슬라이드(Slide), 끌기와 놓기(Drag and drop) 등의 복잡한 누르기 동작을 수행하는 것이 매우 어렵다. 만약 이러한 복잡한 누르기 동작으로만 기능을 실행하도록 구현하면 해당 기능은 이용할 수 없게 된다.

시각장애인은 모바일 화면 낭독 프로그램을 사용하기 때문에, 다중 누르기 등의 복잡한 동작을 수행할 수 없고, 객체 컨트롤을 자유롭게 할 수 없으므로 단순한 누르기, 단순한 제스처 등의 대체수단을 제공하지 않으면 해당 기능을 이용할 수 없다. 또한 특정한 모양을 그리는 동작의 경우 시각장애인은 궤적을 확인할 수 없어 동작 수행이 불가능하고, 상지 장애인은 세밀한 제스처를 취하는 것이 불가능하므로 해당 동작을 수행하는 것이 매우 어렵다.

대상

  • 지체장애
  • 시각장애

체크리스트

  • 복잡한 누르기 동작만으로 실행되는 기능이 있는지 확인
  • 해당 기능을 단순한 누르기 동작으로 동등하게 이용할 수 있는지 확인

복잡한 누르기 동작

2개 이상의 손가락을 사용하는 다중 누르기 동작

  • ex) 두손가락 벌리기를 사용한 확대기능은 확대/축소 버튼 제공

이동 영역의 제한이 있는 한 손가락 쓸기

  • ex1) 볼륨조절슬라이더, 롤링콘텐츠넘기기 등과 같이 쓸기 영역의 제한이 있는 동작은 복잡한 누르기
  • ex2) 잠금해제, 페이지 전환, 당겨서 새로고침과 같이 영역의 제한이 없는 쓸기 동작은 복잡한 누르기가 아님

특정한 도형 또는 형태를 만들어야하는 제스쳐

  • ex1) 안드로이드 시간조절 컨트롤(원 그리기)
  • ex2) 패턴그리기, 드래그앤 드롭

QA 지표

오류 수

  • 복잡한 누르기 동작을 사용하는 기능에서 대체할 수 있는 단순한 누르기 동작을 지원하지 않는 경우 수

적용기술

복잡한 누르기 동작은 단순한 누르기 동작으로 대체하여 제공해야 한다.

아래는 슬라이더를 제공한 예시에 대한 설명이다.

iOS

슬라이더를 사용할 경우 슬라이더의 값을 증가, 감소 시키는 버튼을 함께 제공한다.

  • 슬라이더의 최소값, 최대값을 정하고 증가 시키는 버튼, 감소시키는 버튼을 각각 만든다.
  • 각 버튼의 ‘Touch Up Inside’(눌렀다 뗐을 때) 메서드를 정의하여 슬라이더의 Value 값을 조절한다.

기본값

// 슬라이더의 최소값이 0이고, 최대값이 10일 때
[mySlider setMinimumValue:0.0];
[mySlider setMaximumValue:10.0];
[mySlider setValue:5.0];

값 증가 버튼

(IBAction)increaseValue:(id)sender {
    int sliderValue = (int)(self.mySlider.value + 1.0);
    if (sliderValue > self.mySlider.maximumValue) {
        sliderValue = self.mySlider.maximumValue;
    }
    [self.mySlider setValue:sliderValue];
    [self mySliderValueChanged:nil]; //슬라이더의 값이 바뀜으로서 호출되어야 할 함수
}

값 감소 버튼

(IBAction)decreaseValue:(id)sender {
    int sliderValue = (int)(self.mySlider.value - 1.0);
    if (sliderValue < self.mySlider.minimumValue) {
        sliderValue = self.mySlider.minimumValue;
    }
    [self.mySlider setValue:sliderValue];
    [self mySliderValueChanged:nil]; //슬라이더의 값이 바뀜으로서 호출되어야 할 함수
}

Android

자바 코드 예제

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mButtonUp = (Button)findViewById(R.id.buttonUp);
        mButtonDn = (Button)findViewById(R.id.buttonDn);
        mSeekBar = (SeekBar)findViewById(R.id.seekBar);
    }
    public void onBtnClick(View v) {
        int progress = 0;
        switch(v.getId()) {
        case R.id.buttonUp: // + 버튼을 눌렀을 때
            progress = mSeekBar.getProgress();
            mSeekBar.setProgress(progress + 10);
            break;
        case R.id.buttonDn: // - 버튼을 눌렀을 때
            progress = mSeekBar.getProgress();
            mSeekBar.setProgress(progress - 10);
            break;
        }
    }