MaterialComponentsのテーマカラーがどこに適用されるのかを調べて見た

Androidではテーマでカラースキームを定義しますが、あらかじめ定義されている属性がどこの色指定になっているのかが分かりにくく、調べるのが結構大変ですので、どこを変更したらどこが変わるのかを調べて見ました。
AndroidStudioで新規プロジェクトを作成した時のデフォルトのテーマは以下のようになっています。

```xml:themes.xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/purple_500</item>
    <item name="colorPrimaryVariant">@color/purple_700</item>
    <item name="colorOnPrimary">@color/white</item>
    <item name="colorSecondary">@color/teal_200</item>
    <item name="colorSecondaryVariant">@color/teal_700</item>
    <item name="colorOnSecondary">@color/black</item>
    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
</style>
<style name="Theme.MyApplication.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.MyApplication.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
```

この指定の状態と、上記の指定をすべて外して`Theme.MaterialComponents.DayNight.DarkActionBar`だけを指定した状態(ThemeOverlayの指定は外しています)で様々なコントロールを配置しすると以下のような表示になります。
TextViewは未指定と、`TextAppearance.MaterialComponents.*`を指定したものを配置しています、`Headline`はフォントサイズが大きくなってしまうため、フォントサイズだけ個別に16spを指定しています。

|デフォルト設定|Theme.MaterialComponents<br>.DayNight.DarkActionBarのみ|
|:--:|:--:|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/dc36ff26-b94a-60f8-0685-0b6b1aeff443.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/fb2d8297-bdbe-294e-f820-e1372cb5fb1e.png)|

次に、これらが一色になる設定を探ってみましょう。

```xml:themes.xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/red</item>
    <item name="colorPrimaryVariant">@color/red</item>
    <item name="colorOnPrimary">@color/red</item>
    <item name="colorSecondary">@color/red</item>
    <item name="colorSecondaryVariant">@color/red</item>
    <item name="colorOnSecondary">@color/red</item>
    <!-- 以下追加 -->
    <item name="android:windowBackground">@color/red</item>
    <item name="android:statusBarColor">@color/red</item>
    <item name="android:navigationBarColor">@color/red</item>
    <item name="colorSurface">@color/red</item>
    <item name="colorOnSurface">@color/red</item>
    <item name="colorError">@color/red</item>
    <item name="colorControlNormal">@color/red</item>
    <item name="colorButtonNormal">@color/red</item>
    <item name="colorSwitchThumbNormal">@color/red</item>
    <item name="android:colorForeground">@color/red</item>
    <item name="android:textColorPrimary">@color/red</item>
    <item name="android:textColorSecondary">@color/red</item>
    <item name="android:textColorTertiary">@color/red</item>
    <item name="android:textColorPrimaryDisableOnly">@color/red</item>
</style>
```
最初の指定を全部赤指定にしてみたものが左です、残りの要素も赤一色になるように設定したものが右です。

|デフォルトで指定されている色を赤に|全部が赤になるTheme|
|:--:|:--:|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/8b82b3c6-c233-fce8-e6ee-b26acf953387.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/2967ec8f-a736-489d-ce36-5c67501d7fa6.png)|

ドロップシャドウの部分が残っています。これは`android:ambientShadowAlpha` `android:spotShadowAlpha`でα値を、また、API 28以上であれば、`android:outlineAmbientShadowColor` `android:outlineSpotShadowColor` で色を変更することができるようですが、ここまで変更することは滅多にないでしょうから外しています。

`colorPrimaryVariant`と`colorSecondaryVariant`は`android:statusBarColor`への指定以外では使われていないようなので以下のThemeで赤一色に変わります。

```xml:themes.xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/red</item>
    <item name="colorOnPrimary">@color/red</item>
    <item name="colorSecondary">@color/red</item>
    <item name="colorOnSecondary">@color/red</item>
    <item name="android:windowBackground">@color/red</item>
    <item name="android:statusBarColor">@color/red</item>
    <item name="android:navigationBarColor">@color/red</item>
    <item name="colorSurface">@color/red</item>
    <item name="colorOnSurface">@color/red</item>
    <item name="colorError">@color/red</item>
    <item name="colorControlNormal">@color/red</item>
    <item name="colorButtonNormal">@color/red</item>
    <item name="colorSwitchThumbNormal">@color/red</item>
    <item name="android:colorForeground">@color/red</item>
    <item name="android:textColorPrimary">@color/red</item>
    <item name="android:textColorSecondary">@color/red</item>
    <item name="android:textColorTertiary">@color/red</item>
    <item name="android:textColorPrimaryDisableOnly">@color/red</item>
</style>
```

次に、各項目の色を変更してどこに反映されるかを検証しましょう。指定はいったん全部黒にしてしまって、一カ所ずつ赤に変更してみます。`android:windowBackground` `android:statusBarColor` `android:navigationBarColor`はどこの指定なのか明らかなのと、全部が塗りつぶされていると逆になんの色が変わっているのか分かりにくいので指定を外してしまいます。

```xml:themes.xml
<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/black</item>
    <item name="colorOnPrimary">@color/black</item>
    <item name="colorSecondary">@color/black</item>
    <item name="colorOnSecondary">@color/black</item>

    <item name="colorSurface">@color/black</item>
    <item name="colorOnSurface">@color/black</item>
    <item name="colorError">@color/black</item>
    <item name="colorControlNormal">@color/black</item>
    <item name="colorButtonNormal">@color/black</item>
    <item name="colorSwitchThumbNormal">@color/black</item>
    <item name="android:colorForeground">@color/black</item>
    <item name="android:textColorPrimary">@color/black</item>
    <item name="android:textColorSecondary">@color/black</item>
    <item name="android:textColorTertiary">@color/black</item>
    <item name="android:textColorPrimaryDisableOnly">@color/black</item>
</style>
```
|初期状態|`colorPrimary`|
|:--:|:--:|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/fdcf349f-befe-57b3-19d3-5c284f4f2f7a.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/6ecd637a-cdd3-d7ae-9278-33951610ee0f.png)|
|`colorOnPrimary`|`colorSecondary`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/98589052-b849-15d0-4a03-b1f14f5137ab.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/1fe5fea4-4f47-0ef8-e8c9-4ab051bc8945.png)|
|`colorOnSecondary`|`colorSurface`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/92e45a21-7eb1-8ba1-6250-f2c5296d6e8a.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/dc00c01d-a753-8008-d68c-d71bf7f7d816.png)|
|`colorOnSurface`|`colorError`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/1bfd8166-c5ee-78c9-2928-a027557e619b.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/8120c1ee-9eb2-abbe-06fc-c262cbb5dab4.png)|
|`colorControlNormal`|`colorButtonNormal`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/d643404b-27af-9ee7-e9f6-484c5e6dae7b.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/1db1cecc-3175-30f3-5fba-7247d45c3096.png)|
|`colorSwitchThumbNormal`|`android:colorForeground`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/66712250-f286-f337-2e29-ed84dd52d2b8.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/00ee0507-8dd8-2d84-75ec-118a0f13474e.png)|
|`android:textColorPrimary`|`android:textColorSecondary`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/bbb64c6f-cdac-c158-6bdf-6a12970bb31c.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/33a1dbe7-e56e-2667-e172-5983f9799682.png)|
|`android:textColorTertiary`|`android:textColor`<br>`PrimaryDisableOnly`|
|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/83957e47-03a3-d62f-e08a-e555e744fd37.png)|![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155171/a8e4def8-a2df-2986-3010-730a749af54e.png)|