前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

自前でRipple Effectを呼ぶ

課題

Viewに android:foreground="?android:attr/selectableItemBackground" を定義しているが、プログラム上から呼び出して使用したい。

対応

RippleDrawableのstateを変更することでエフェクトが発生するのでstateを変更してあげれば良い。 以下のサンプルはview.foregroundに RippleDrawableが定義されていることを前提としている

if (Build.VERSION.SDK_INT >= 23 
  && view.foreground isRippleDrawable) {
        val rippleDrawable: RippleDrawable = view.foreground as
                                RippleDrawable
                        rippleDrawable.state = arrayOf(
                            android.R.attr.state_pressed,
                            android.R.attr.state_enabled
                        ).toIntArray()
                        holder.itemView.postDelayed({
                            rippleDrawable.state = IntArray(0)
                        }, 200)
                   }

ダブルタップ対応でonClickListenerではなくonTouchListenerを使おうとしたときに必要になった。
view.backgroundの場合はSDK_INTは21以上から対応しているかと。

参考

How to trigger ripple effect on Android Lollipop, in specific location within the view, without triggering touches events? - Stack Overflow