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"は無いが、同じ原理で同様に小さいバージョンを作るのは難しくないだろう。