9-patchとビューの縮小 (原因と対策)

見て解る通りだが、高さを40dpに設定すると無効時の描画が縞模様になってしまう。
50dpから少しずつサイズを下げて見たが、46dpからこのように描画がおかしく(濃い灰色の領域が閉じない)なることが分った。

この原因はやはり9-Patch処理された画像に由来するものだった。

  • btn_default_normal_disable.9.png


以前の日記で9-Patch処理される画像は、固定領域(コンテンツ)と伸張領域(パッチ)に分けて作成されると書いたが、この画像がBackgroundDrawable として適用されるビューの高さ(Height)が画像の固定領域の高さ(右端のドットの長さ)よりも小さくなるとこの現象が発生する。

なので対処も9-Patch画像で可能。
今回のようにボタンの高さ(Height)を固定領域である46dpよりも低くしたい場合、通常使われている9-patch画像よりも小さいものを用意してやればよい。
Buttonであれば、デフォルトでセットされているであろうbtn_default_normal.xmlに対して、少し小さめのサイズの画像が指定されいるbtn_default_small.xmlというselectorが存在するので、代わりにこれをセットしてやれば良い。

  • layout.xml上で設定
 <Button
    android:id="@+id/Button01"
    android:enabled="false"
    〜
    android:background="@android:drawable/btn_default_small"
   ></Button>
  • コードで設定 (Activity内)
  Button Button01 = new Button(this);
  Button01.setEnabled(false);
  〜
  Button01.setBackgroundDrawable(
                  this.getResources().getDrawable(
                      android.R.drawable.btn_default_small));

検証のために無効化状態にしたボタンを、backGroundDrawableにbtn_default_normalとbtn_default_smallをセットしたものに分け、高さを2dpずつ変えたものを描画したのが以下のSSだが、btn_default_smallの側は36dp(160dpi)までは描画が崩れないことが判るだろう。

EditTextには"〜_small"は無いが、同じ原理で同様に小さいバージョンを作るのは難しくないだろう。