2011年4月21日木曜日

Android ImageView Levelによって画像変える

ImageViewをLevelによって画像を変えることができるらしい。バッテリーの残量だったり、降水確率だったり、数値によって画像を変えたいときに使える。

Levelによって画像を変えるには、Level List - Drawable Resources | Android DevelopersのXMLを定義してやる。
syntax:
<?xml version="1.0" encoding="utf-8"?>
<level-list
xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/drawable_resource"
android:maxLevel="integer"
android:minLevel="integer" />
</level-list>
書き方は上記の通りだが、詳細はAndroid Developersで見て。


とりあえずサンプル。特に良い例も思い浮かばないので、じゃんけんの勝敗を画像で表示する。
まずは、適当にlose.png,draw.png,win.pngを用意してdrawableに置いておく。で、XMLでLevelListを定義する。名前はgame.xmlとした。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:maxLevel="0" android:drawable="@drawable/lose" />
 <item android:maxLevel="50" android:drawable="@drawable/draw" />
 <item android:maxLevel="100" android:drawable="@drawable/win" />
</level-list>
で、ImageViewのsrcにこのxmlを指定する。
    <ImageView android:id="@+id/game" android:src="@drawable/game"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />

あとはロジック側でsetImageLevelをしたればlevelに応じて画像を出し分けてくれる。
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        game = (ImageView) findViewById(R.id.game);
        game.setVisibility(View.INVISIBLE);
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Button button = (Button) arg0;
                game(button.getText().toString());
            }
        };
        ((Button) findViewById(R.id.guu)).setOnClickListener(listener);
        ((Button) findViewById(R.id.choki)).setOnClickListener(listener);
        ((Button) findViewById(R.id.paa)).setOnClickListener(listener);
    }

    // めんどくさいので、相手はパーしか出しません。
    private void game(String hand) {
        if (hand.equals("グー")) {
            game.setImageLevel(0);
        } else if (hand.equals("チョキ")) {
            game.setImageLevel(100);
        } else {
            game.setImageLevel(50);
        }
        game.setVisibility(View.VISIBLE);
    }

この例だと、ロジック側でif文判断してるんだから、そこでそれぞれの場合に応じて画像をセットすればいいじゃんと思う。あんまり適した例ではなかったな。バッテリー残量とか降水確率とかもともと数値を持ってるもので、その数値によって画像を変えたいときに使うべきか。

例は良くなかったが、ImageViewはLevelListで定義したLevelに応じて画像を出し分けることができる。覚えておこう。いつか使い道は来るはず。