일부 Wear OS 기기에는 RSB(Rotating Side Button)와 같은 로터리 입력이 지원됩니다. 사용자가 버튼을 돌리면 앱의 현재 뷰가 위 또는 아래로 스크롤됩니다.
사용자가 앱에서 ScrollView, ListView, HorizontalScrollView 또는 WearableRecyclerView를 사용 중인 경우 앱의 뷰에서 기본적으로 로터리 입력이 지원됩니다. 위에 나열된 뷰가 아닌 맞춤 뷰를 사용 중이거나 로터리 입력 이벤트를 수동으로 처리하려는 경우 맞춤 로터리 입력 스크롤 추가를 참조하세요.
다음 관련 리소스를 참조하세요.
포커스 권장사항
로터리 입력 이벤트에 응답하려면 스크롤 뷰에 포커스가 있어야 합니다. 대부분의 경우 이는 자동으로 일어나며, 활동을 만든 직후 스크롤 뷰에 포커스가 놓입니다. 그러나 다음과 같이 앱의 뷰 포커스를 수동으로 처리해야 하는 경우도 있습니다.
- 스크롤 가능한 뷰가 Activity.onCreate() 이후에 연결되는 경우(예: UI를 빌드하기 전에 네트워크 요청이 완료되기를 기다림) 연결 후에 requestFocus를 호출해야 합니다.
- 스크롤 가능한 뷰가 초기에 INVISIBLE 또는 GONE인 경우 뷰를 VISIBLE로 설정할 때
requestFocus
를 호출해야 합니다. - 활동에 스크롤 가능한 뷰가 여러 개 포함된 경우(예: 중첩된 스크롤 사용) 포커스를 두려는 뷰를 하나 선택해야 합니다(일반적으로 <requestFocus /> 태그를 통해 선택). RSB 스크롤에서는 현재 중첩된 스크롤이 지원되지 않습니다.
- 사용자가 UI와 상호작용할 때 포커스를 가로채는 다른 뷰가 UI에 포함되어 있는 경우(드문 경우지만 가장 일반적인 예는
InputText
임), 포커스를 놓쳤을 때 스크롤 가능한 뷰로 포커스를 복원하는 방법을 사용자에게 제공해야 합니다. 일반적인 방법은 스크롤 가능한 뷰에서 탭을 수신하고 응답으로requestFocus
를 호출하는 것입니다.
맞춤 로터리 입력 스크롤 추가
스크롤 가능한 뷰가 기본적으로 로터리 입력 스크롤을 지원하지 않거나 로터리 입력 이벤트에 대한 응답에서 스크롤 외에 다른 작업을 하려는 경우(확대/축소, 다이얼 돌리기 등) 웨어러블 지원 라이브러리의 RotaryEncoder
메서드를 사용할 수 있습니다.
다음 코드 스니펫은 RotaryEncoder
를 사용하여 앱의 뷰에 맞춤 스크롤을 추가하는 방법을 보여줍니다.
Kotlin
myView.setOnGenericMotionListener(View.OnGenericMotionListener { v, ev -> if (ev.action == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) { // Don't forget the negation here val delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(context) // Swap these axes if you want to do horizontal scrolling instead v.scrollBy(0, Math.round(delta)) return@OnGenericMotionListener true } false })
자바
myView.setOnGenericMotionListener(new View.OnGenericMotionListener() { @Override public boolean onGenericMotion(View v, MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) { // Don't forget the negation here float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor( getContext()); // Swap these axes if you want to do horizontal scrolling instead v.scrollBy(0, Math.round(delta)); return true; } return false; } });
에뮬레이터에서 로터리 입력 버튼 테스트
Wear 기기에서 로터리 입력 스크롤을 시뮬레이션하려면 Android 에뮬레이터를 사용하면 됩니다. 프로젝트를 실행할 때 에뮬레이터에서 Wear 앱을 시작할 수도 있고, APK 파일을 에뮬레이터로 드래그하여 설치할 수도 있습니다.
에뮬레이터에서 로터리 입력을 테스트하려면 다음을 따르세요.
- SDK Manager의 SDK Tools 탭에서 Android Emulator 26.0.3 이상을 가져옵니다.
- API 25로 AVD(Android Virtual Device)를 만듭니다.
스튜디오에서 Tools>Android>AVD Manager를 선택합니다. API 25로 새 Wear 기기를 만듭니다.
- Android 스튜디오에서 에뮬레이터를 실행합니다.
- 로터리 입력 스크롤을 시도합니다.
오버플로 버튼(에뮬레이터 툴바 맨 아래에 있는 3개의 점)을 클릭합니다. 새 창에서 로터리 입력 탭을 클릭하여 로터리 입력 인터페이스를 엽니다.
다음 동영상은 에뮬레이터에서의 로터리 입력을 보여줍니다.
포커스 동작 팁
- Android 9(API 수준 28)부터 뷰는 더 이상 포커스를 암시적으로 받지 않기 때문에 대신 명시적으로 포커스를 받아야 합니다.
android:focusable="true"
와android:focusableInTouchMode="true"
를 모두 사용하여 스크롤 가능 뷰를 포커스 가능으로 등록해야 합니다.- 포커스 가능 뷰일지라도 기본적으로는 활동을 실행하거나 뷰를 탭하는 동작만으로는 뷰에 포커스가 놓이지 않습니다. 이 동작을 수행하려면 뷰에서
<requestFocus />
태그를 사용하거나View.requestFocus()
를 수동으로 호출해야합니다. - 로터리 입력 이벤트는 포커스가 놓인 뷰로만 전송됩니다. 이러한 이벤트는 뷰 계층 구조 위로 올라가지 않습니다. 포커스가 놓인 뷰가 없거나 포커스가 놓인 뷰가
View.onGenericMotionEvent
에서false
를 반환하는 경우에만 이벤트가Activity.onGenericMotionEvent
로 전송됩니다.