web-dev-qa-db-ja.com

Android ImageButtonをToggleとして設定

画像ボタンがクリックされたときに「押された」状態のままにするにはどうすればよいですか?基本的には背景をくぼんだ背景にしたいのですが、どうやって設定すればいいのかわかりません。現時点では、選択したボタンの背景をresフォルダーにコピーしましたが、背景として設定するとぼやけます(元の画像がボタン自体よりも大きいため)。

通常の背景: 代替テキストhttp://img707.imageshack.us/img707/9199/ss20100426163452.png 私が得ているもの: 代替テキストhttp://img707.imageshack.us /img707/912/ss20100426163357.png代替テキストhttp://img3.imageshack.us/img3/8304/ss20100426163623.png

また、さまざまなUIレイアウトを考慮すると、実際にこの方法を使用できるとは思いません。ユーザーが使用しているUIに従って、ボタンを押したままにする必要があります。

17
Kleptine

これを行うにはいくつかの方法があります。

まず、ImageButtonを使用するだけで、Javaでクリックすると描画可能な画像を手動で切り替えることができます。これは ストックミュージックプレーヤー on Android shuffle ボタン たとえば。チェックされた状態ではボタンの背景を制御することはできませんが、画像を入れ替えることはできます。これは、Android UIの一貫性の観点から有利な場合があります。

もう1つのオプションは、ドローアブルと9つのパッチの複雑なセットを使用して、ToggleButton内の画像を取得することです。切り替え時に、背景や画像リソースを変更することもできます。これが、以下に示すオプションです。ただし、これを行う前に、UIの一貫性に注意してください。


_res/layout/foo.xml_

_...
<ToggleButton
    Android:textOn="" Android:textOff=""
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:background="@drawable/shuffle_button" />
...
_

_res/drawable/shuffle_button.xml_

_<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- use "@Android:drawable/btn_default" to keep consistent with system -->
    <item Android:drawable="@drawable/toggle_button_background" />
    <item Android:drawable="@drawable/shuffle_button_image" />
</layer-list> 
_

_res/drawable/toggle_button_background.xml_

_<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- checked state -->
    <item Android:state_pressed="false" Android:state_checked="true"
          Android:drawable="@drawable/btn_default_checked" />

    <item Android:state_window_focused="false" Android:state_enabled="true"
          Android:drawable="@drawable/btn_default_normal" />
    <item Android:state_window_focused="false" Android:state_enabled="false"
          Android:drawable="@drawable/btn_default_normal_disable" />
    <item Android:state_pressed="true"
          Android:drawable="@drawable/btn_default_pressed" />
    <item Android:state_focused="true" Android:state_enabled="true"
          Android:drawable="@drawable/btn_default_selected" />
    <item Android:state_enabled="true"
          Android:drawable="@drawable/btn_default_normal" />
    <item Android:state_focused="true"
          Android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item Android:drawable="@drawable/btn_default_normal_disable" />
</selector>
_

_res/drawable/shuffle_button_image.xml_

_<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/ic_mp_shuffle_on_btn" Android:state_checked="true" />
    <item Android:drawable="@drawable/ic_mp_shuffle_off_btn" />
</selector>
_

画像ファイル

[〜#〜]警告[〜#〜]:これらを使用すると、カスタマイズされたOS UI(つまり、HTCのSense)を備えたデバイスでアプリの一貫性が失われます。 UI)。

  • _ic_mp_shuffle_<state>_btn.9.png_は9パッチである必要があります。これにより、画像が中央に配置され、ボタンに合わせて引き伸ばされなくなります。以下は、アイコンのhdpiバージョンの例です。

res/drawable-(h|m|ldpi)/ic_mp_shuffle_(on|off)_btn.9.png


最後の注意:可能な場合はシステムUIと一貫性を保つことを忘れないでください。また、カスタマイズされたバージョンのデバイスでアプリが実行される可能性があることに注意してください。ボタンなどのUI要素のグラフィックが異なるOS。この例は HTC Sense で、Androidの在庫の灰色/オレンジ/黄色のボタンの代わりに緑色のボタンがあります。したがって、オープンソースリポジトリから_btn_default_..._ PNGファイルをコピーして切り替え可能なボタンの背景を作成することになった場合、それらのデバイスの一貫性が失われます。

40
Roman Nurik