■作るもの
アプリのボタンデザインがデフォルトと同じでは寂しいので少し手を加えます。ここでは画像を使わずに、xmlでデザインする方法を考えます。目標は「ボタンに"押された感じ"を出すこと」です。
■完成イメージ
ここで書いた方法でこのアプリのボタンを作りました。実際に触ってみると分かりやすいと思います。
PCからAndroid Marketに行く
Android携帯からAndroid Marketに行く
○ボタンが押される前
○ボタンが押された時
■ボタンを「’押した」と感じるために
Androidのデフォルトのボタンは次のような挙動です。
・通常時、下が濃い色のグラデーション
・ボタンが押されると、グラデーションの濃淡が上下逆転する
これを参考にします。今回はこれに加え、
・ボタンが押されると、ボタンが一回り小さくなる
という挙動を追加します。
■XMLの実装
やったのは、グラデーションをつける、角を丸くする、縁取り、です。また「ボタンが押されると、ボタンが一回り小さくなる」という挙動は、縁取りを背景と同じ色にしておき、ボタンが押された時に縁取りを太くする事で対応しました。
・レイアウトしたいxml
設定したいButtonに
・drawable/my_button.xml
・android:state_pressed="true"
ボタンが押されている状態を定義
・android:state_focused="true"
フォーカスされている状態を定義
・android:shape="rectangle"
ボタンの形を定義
・<gradient
グラデーションの設定
android:angle="270"
3時の方向を基準に、グラデーションの方向を決める
android:startColor="#294275"
グラデーション開始色
android:endColor="#9499AA"
グラデーション終了色
android:type="linear" />
グラデーションの種類を定義
・<corners
android:radius="4dip" />
角を取る時の半径を設定
・<stroke
android:width="2dip"
android:color="#000000"/>
縁取りの設定。今回は背景と同じ色を設定している。ボタンが押された時にwidthの値を大きくすることで、ボタンが奥に移動するような効果が出た…のではないか。
■コメント
・このように、9-patch画像を作らなくても、そこそこ格好良いボタンが作成可能です。
・ソースはもっとシンプルにできそうです。
アプリのボタンデザインがデフォルトと同じでは寂しいので少し手を加えます。ここでは画像を使わずに、xmlでデザインする方法を考えます。目標は「ボタンに"押された感じ"を出すこと」です。
■完成イメージ
ここで書いた方法でこのアプリのボタンを作りました。実際に触ってみると分かりやすいと思います。
PCからAndroid Marketに行く
Android携帯からAndroid Marketに行く
○ボタンが押される前
○ボタンが押された時
■ボタンを「’押した」と感じるために
Androidのデフォルトのボタンは次のような挙動です。
・通常時、下が濃い色のグラデーション
・ボタンが押されると、グラデーションの濃淡が上下逆転する
これを参考にします。今回はこれに加え、
・ボタンが押されると、ボタンが一回り小さくなる
という挙動を追加します。
■XMLの実装
やったのは、グラデーションをつける、角を丸くする、縁取り、です。また「ボタンが押されると、ボタンが一回り小さくなる」という挙動は、縁取りを背景と同じ色にしておき、ボタンが押された時に縁取りを太くする事で対応しました。
・レイアウトしたいxml
設定したいButtonに
android:background="@drawable/my_button"を記述。
・drawable/my_button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- ボタンが押されている -->
<!-- フォーカスされていない -->
<item android:state_pressed="true"
android:state_focused="false">
<layer-list>
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#294275"
android:endColor="#9499AA"
android:type="linear" />
<corners
android:radius="4dip" />
<stroke
android:width="2dip"
android:color="#000000"/>
</shape>
</item>
</layer-list>
</item>
<!-- ボタンが押されていない -->
<!-- フォーカスされていない -->
<item android:state_pressed="false"
android:state_focused="false">
<layer-list>
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#9499AA"
android:endColor="#294275"
android:type="linear" />
<corners
android:radius="4dip" />
<stroke
android:width="0.5dip"
android:color="#000000"/>
</shape>
</item>
</layer-list>
</item>
<!-- ボタンが押されている -->
<!-- フォーカスされた -->
<item android:state_pressed="true"
android:state_focused="true">
<layer-list>
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#294275"
android:endColor="#9499AA"
android:type="linear" />
<corners
android:radius="4dip" />
<stroke
android:width="2dip"
android:color="#CC6600"/>
</shape>
</item>
</layer-list>
</item>
<!-- ボタンが押されていない -->
<!-- フォーカスされた -->
<item android:state_pressed="false"
android:state_focused="true">
<layer-list>
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#9499AA"
android:endColor="#294275"
android:type="linear" />
<corners
android:radius="4dip" />
<stroke
android:width="0.5dip"
android:color="#FF6600"/>
</shape>
</item>
</layer-list>
</item>
</selector>
・android:state_pressed="true"
ボタンが押されている状態を定義
・android:state_focused="true"
フォーカスされている状態を定義
・android:shape="rectangle"
ボタンの形を定義
・<gradient
グラデーションの設定
android:angle="270"
3時の方向を基準に、グラデーションの方向を決める
android:startColor="#294275"
グラデーション開始色
android:endColor="#9499AA"
グラデーション終了色
android:type="linear" />
グラデーションの種類を定義
・<corners
android:radius="4dip" />
角を取る時の半径を設定
・<stroke
android:width="2dip"
android:color="#000000"/>
縁取りの設定。今回は背景と同じ色を設定している。ボタンが押された時にwidthの値を大きくすることで、ボタンが奥に移動するような効果が出た…のではないか。
■コメント
・このように、9-patch画像を作らなくても、そこそこ格好良いボタンが作成可能です。
・ソースはもっとシンプルにできそうです。




@tattyamm




