?attr/selectableItemBackgroundは何色か
答え:
アプリ・Activityに適用しているテーマ、起動するAndroid OS VersionとcompileSdkVersionとサポートライブラリのバージョンによる。
Theme.AppCompat.Light
を使っていてAndroid 5.0以上でcompileSdkVersion 28でAndroidXなら #21000000
以下解説
?attrとは何か
?attrは適用しているテーマに定義されている値を参照する。なのでアプリに適用しているテーマを確認すればよい。
テーマを辿る
例えばAndroidXで Theme.AppCompat.Light
を使っているとする。
AndroidXのres/values を見ると values-v16~v28まである。それぞれの theme_base.xml
を見て階層構造を確認してみると以下の図のようになる(もはやAndroid 4系を見る必要はないのでここではv21以上を対象とする)。
では実際にどの selectableItemBackground
が使われるかを見る。
selectableItemBackground
は android:Theme.Material.Light.NoActionBar
以外には宣言されていないので android:Theme.Material.Light.NoActionBar
の selectableItemBackground
が使われることになる。
これはアプリのAndroid SDK、つまり compileSdkVersion
で指定しているSDKにあるスタイルが使われる。
ここからはAndroid Studio上でコードを確認できる。
マテリアルデザイン系のテーマは themes_material.xml
に定義されている。
Theme.Material.Light.NoActionBar
には selectableItemBackground
がないのでその一つ前の Theme.Material.Light
を見る。
<style name="Theme.Material.Light" parent="Theme.Light"> ... <item name="selectableItemBackground">@drawable/item_background_material</item>
ようやく宣言が見つかった。
item_background_material.xml
を見てみる。
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?attr/colorControlHighlight"> <item android:id="@id/mask"> <color android:color="@color/white" /> </item> </ripple>
?attrなのでもう一度上のテーマ階層を順に見ていくが colorControlHighlight
は宣言されていないので Theme.Material.Light
に戻る。
<style name="Theme.Material.Light" parent="Theme.Light”> ... <item name="colorControlHighlight">@color/ripple_material_light</item>
Android SDK内の ripple_material_light.xml
を見る。
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:alpha="@dimen/highlight_alpha_material_light" android:color="@color/foreground_material_light" /> </selector>
色は foreground_material_light
であることがわかった。更に辿っていく。
colors_material_xml
<color name="foreground_material_light">@color/black</color>
colors.xml
<color name="black">#ff000000</color>
ついに到達。 #ff000000
である。
同様にアルファも見ると0.12であることがわかった。
<item name="highlight_alpha_material_light" format="float" type="dimen">0.12</item>
アルファを16進数にに置き換えると21。つまり #21000000
となる。
おわりに
全部は確認していないが、Android 5.0以上であればどのcompileSdkVersionでどのサポートライブラリのバージョンでもそうそうこの色は変わらないのではないかと思う。必要であればそれぞれの環境の値をこの記事と同じ方法で辿っていけば実際の値が確認できる。