Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

xmlに複数の画像を配列で定義してランダムに表示させる

自分用メモです。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <array name="train_images">
        <item>@drawable/train01</item>
        <item>@drawable/train02</item>
        <item>@drawable/train03</item>
        <item>@drawable/train04</item>
        <item>@drawable/train05</item>
        <item>@drawable/train06</item>
    </array>

</resources>
        // 6色の画像から毎回ランダムに出す
        TypedArray typedArray = getResources().obtainTypedArray(R.array.train_images);
        int i = (int) (Math.floor(Math.random() * (6 - 1 + 1)) + 1);
        Drawable drawable = typedArray.getDrawable(i);
        mImageViewTrain.setImageDrawable(drawable);

2013/02/09追記
@kimukou_26 さんにコメント頂きました!この書き方もできるのですね。kimukou_26さんありがとうございます!

kimukou_26 2013/02/07 10:20
int resid = typedArray.getResourceId(i, -1);
if(resid!=-1)mImageViewTrain.setImageResource(resid);

でもいけるかも(上記の想定の場合

Drawableで書く場合って、CSSアニメみたいにXMLで記述したの読み込む場合とか何でしょうかね。。

http://greety.sakura.ne.jp/redo/2010/09/xmldrawable.html
sakura_bird1 2013/02/07 10:25
おお、きむこうさんありがとうございます!
そういう風にすればいいんだ!
Drawableって単にリソース取ってくるだけでは使わないものなのでしょうか?
kimukou_26 2013/02/07 10:35
xml複数の画像を」
というタイトルでしたので、train_imagesが bitmap/gif/jpeg等の画像データの認識でした。

その場合だと自分だと普通減色して使ってしまうかなと思いつつ<メモリ対策で
(低端末の場合(2.1の頃の機種とか)は boolean Low_bmp_flag =true

boolean Low_bmp_flag =false;
Resource m_r = getResource();
Bitmap.Config conf_l = Low_bmp_flag ? Bitmap.Config.ARGB_4444:Bitmap.Config.ARGB_8888;

//〜略〜

if(resid!=-1){
Bitmap bt = BitmapFactory.decodeResource(m_r, resid ,conf_l);
if(bt==null)return null;
Bitmap b = bt.copy(conf, true);
bt.recycle();bt=null;
mImageViewTrain.setImageBitmap(b);
}

2013/02/09 追記
id:kimukou_26 さんにコメント頂きました!この書き方もできるのですね。おかげで超カンタンメモ的なブログがとてもまともになりました。id:kimukou_26さんありがとうございます!(リンク方法も直しました)

ちなみに、あまりこういう書き方はしないかもしれませんが
下記のようなもたせ方も可能です


@array/train_images
@array/car_images
@array/ship_images


@drawable/train01
@drawable/train02
@drawable/train03
@drawable/train04
@drawable/train05
@drawable/train06




〜略〜

Resources m_r = getResources();
TypedArray typedArrayM = m_r.obtainTypedArray(R.array.anime_type);

int index = 0;
//参照index,見つからなかった時のデフォルトID
int pnum = typedArrayM.getResourceId(index, R.array.train_images);
TypedArray typedArray = m_r.obtainTypedArray(pnum); //★

デフォルト値が微妙であれば
typedArrayM.getIndexCount() で配列最大数は取得可能かと。


もちろん中に入れられる配列はstring-array みたいな別の物も可能です
その場合は ★が
m_r.getStringArray()
等になるとおもいます

                                                                                                                                                • -

PS)
はてなブログ間でリンクするには(はてなブログリンク)

id:XXXXX or id:XXXX
のほうが良いかもしれませんね−(twitter idより

http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E4%B8%80%E8%A6%A7

でもtwitter_idのリンク方法は知りませんでしたので勉強になりました(ぺこり

2013/02/12 上記のid:kimukou_26 さんのアドバイスに基いて
コードを下記のように修正いたしました。
Drawable使わずsetImageResource()を使ったほうがいいみたいです。
修正前は何回かに一回リロード時に画像がアニメーションしなかったのですが、修正後は
大丈夫みたいです。20回ぐらいしかリロードしてないからまた不具合あったらブログ更新します。

        mImageViewTrain.clearAnimation();
        // 6色の画像から毎回ランダムに出す
        int i = (int) (Math.floor(Math.random() * (6 - 1 + 1)) + 1);
        int resid = mTypedArray.getResourceId(i, -1);
        if (resid != -1) {
            mImageViewTrain.setImageResource(resid);
        }
        // アニメーション
        Animation anime = AnimationUtils.loadAnimation(getActivity(), R.anim.train);
        mImageViewTrain.startAnimation(anime);