はじめに
ViewPager2+WearableRecyclerViewでロータリー入力によるスクロール処理を行う方法について解説。
ViewPager2+WearableRecyclerViewだとフォーカスが効かなくなるので、requestFocus()
やsetOnGenericMotionListener()
メソッドが使用できない。
方法
Activity
内でonGenericMotionEvent()
メソッドを上書きする。
override fun onGenericMotionEvent(event: MotionEvent?): Boolean { if (!(event?.action == MotionEvent.ACTION_SCROLL && event.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER))) return false //スクロールビューを取得。適宜変更。 val viewHolder = (binding.viewPager[0] as RecyclerView).findViewHolderForAdapterPosition(binding.viewPager.currentItem) val scrollView = (viewHolder as ViewPagerAdapter.ViewHolder).binding.recyclerView //スクロール量 val amount = (-event.getAxisValue(MotionEventCompat.AXIS_SCROLL) * ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(this), this)).toInt() //スクロール scrollView.scrollBy(0, amount) return true }