nakashimaakioのブログ

Androidアプリエンジニア / 記事に「はてなスター」よろしくお願いします。

【Android Wear】ViewPager2+WearableRecyclerViewでロータリー入力によるスクロール処理

はじめに

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
    }

公式リファレンス

developer.android.com