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 =trueboolean 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 追記
さんにコメント頂きました!この書き方もできるのですね。おかげで超カンタンメモ的なブログがとてもまともになりました。さんありがとうございます!(リンク方法も直しました)
ちなみに、あまりこういう書き方はしないかもしれませんが
下記のようなもたせ方も可能です
@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
のほうが良いかもしれませんね−(twitter idよりでも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);