phicdy devlog

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

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

ButtonのstateListAnimatorをnullにするとelevationがなくなるのはなぜか

環境

  • テーマはTheme.MaterialComponents.Light
  • appcompat 1.2.0
  • material 1.2.1
  • minSdkVersion 23

コードを追う

  • 継承関係を追うと、Theme.MaterialComponents.Light -> Base.Theme.MaterialComponents.Light -> Base.V21.Theme.MaterialComponents.Light -> Base.V14.Theme.MaterialComponents.Light -> Platform.MaterialComponents.Light -> Base.Theme.AppCompat.Light
  • Base.Theme.AppCompat.Lightはバージョンごとに違うが大本の親はBase.V21.Theme.AppCompat.Light
  • Base.V21.Theme.AppCompat.LightのbuttonStyleは?android:attr/buttonStyleなので親を見る
  • Base.V21.Theme.AppCompat.LightはBase.V7.Theme.AppCompatを継承
  • Base.V7.Theme.AppCompatはbuttonStyleに@style/Widget.AppCompat.Buttonを指定
  • Widget.AppCompat.ButtonはBase.Widget.AppCompat.Buttonを継承
  • Base.Widget.AppCompat.Buttonはv21でandroid:Widget.Material.Buttonを継承
    <style name="Widget.Material.Button">
        <item name="background">@drawable/btn_default_material</item>
        <item name="textAppearance">?attr/textAppearanceButton</item>
        <item name="minHeight">48dip</item>
        <item name="minWidth">88dip</item>
        <item name="stateListAnimator">@anim/button_state_list_anim_material</item>
        <item name="focusable">true</item>
        <item name="clickable">true</item>
        <item name="gravity">center_vertical|center_horizontal</item>
    </style>

ここのstateListAnimatorで指定しているbutton_state_list_anim_materialでelevationを指定しているのでこれを消せばよい https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/anim/button_state_list_anim_material.xml