phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

?attr/selectableItemBackgroundは何色か

答え:

アプリ・Activityに適用しているテーマ、起動するAndroid OS VersionとcompileSdkVersionとサポートライブラリのバージョンによる。 Theme.AppCompat.Light を使っていてAndroid 5.0以上でcompileSdkVersion 28でAndroidXなら #21000000

以下解説

?attrとは何か

?attrは適用しているテーマに定義されている値を参照する。なのでアプリに適用しているテーマを確認すればよい。

developer.android.com

テーマを辿る

例えばAndroidXで Theme.AppCompat.Light を使っているとする。

AndroidXのres/values を見ると values-v16~v28まである。それぞれの theme_base.xml を見て階層構造を確認してみると以下の図のようになる(もはやAndroid 4系を見る必要はないのでここではv21以上を対象とする)。

f:id:phicdy:20190213233851p:plain

では実際にどの selectableItemBackground が使われるかを見る。

selectableItemBackgroundandroid:Theme.Material.Light.NoActionBar 以外には宣言されていないので android:Theme.Material.Light.NoActionBarselectableItemBackground が使われることになる。 これはアプリの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 となる。

qiita.com

おわりに

全部は確認していないが、Android 5.0以上であればどのcompileSdkVersionでどのサポートライブラリのバージョンでもそうそうこの色は変わらないのではないかと思う。必要であればそれぞれの環境の値をこの記事と同じ方法で辿っていけば実際の値が確認できる。