res/drawableに保存した画像の束からランダムな画像を表示したい。
私が知っている唯一のテクニックは、リソースIDがわかっている場合に、特定の画像にアクセスすることです。ファイル名または他の何か(実行時に作成できます)を使用して画像にアクセスする方法はありますか?
実行時にランダムに画像を選択したい。どんな提案/アイデアもありがたいです:)
ありがとうChinmay
res/drawableに保存した画像の束からランダムな画像を表示したい。
私が知っている唯一のテクニックは、リソースIDがわかっている場合に、特定の画像にアクセスすることです。ファイル名または他の何か(実行時に作成できます)を使用して画像にアクセスする方法はありますか?
実行時にランダムに画像を選択したい。どんな提案/アイデアもありがたいです:)
ありがとうChinmay
これは非常に古い質問だと思いますが、Google社員に良い解決策を提供したいと思いました。
名前によるリソースへのアクセスは、IDによるアクセスよりもはるかに効率的ではありません。リソースシステムの要点は、名前を解決する必要がなく、代わりにIDを使用できるようにすることです。
あなたがする必要があるのは、配列リソースタイプを利用することです。私の簡単な手順に従ってください!ランダムな画像を作ります...楽しい!
選択するすべての画像を含む配列リソースを作成します。これをファイルに入れましたが、res/values/arrays.xml
実際にはどこにでも移動できます。
<array name="loading_images">
<item>@drawable/bg_loading_1</item>
<item>@drawable/bg_loading_2</item>
<item>@drawable/bg_loading_3</item>
<item>@drawable/bg_loading_5</item>
<item>@drawable/bg_loading_6</item>
<item>@drawable/bg_loading_7</item>
<item>@drawable/bg_loading_8</item>
</array>
次に、TypedArray
からを取得し、Resources
それを使用してランダムな画像を選択します。
TypedArray images = getResources().obtainTypedArray(R.array.loading_images);
int choice = (int) (Math.random() * images.length());
mImageView.setImageResource(images.getResourceId(choice, R.drawable.bg_loading_1));
images.recycle();
利益!
名前でリソースにアクセスすることもできます。これは、リソースの名前を知っている場合、または事前定義された命名スキームに従ってリソースを導出できる場合に、問題を解決するための実行可能なアプローチになる可能性があります。
クラスのgetIdentifierメソッドを使用して、名前を識別子にマップする必要がありますResources
。
String name = "resource" + rng.nextInt(count);
int resource = getResources().getIdentifier(name, "drawable", "com.package");
このメソッドのドキュメントには次のように書かれています。
注:この関数の使用はお勧めしません。名前よりも識別子でリソースを取得する方がはるかに効率的です。
これは真実ですが、パフォーマンスに影響されないコードで実行している場合は問題になる必要はありません。
または、リソースをXMLでリストしてもかまわない場合は、型付き配列を作成して、ランダムに選択することもできます。
res / drawableの項目は、コンパイル時にR.drawableクラスに列挙されます。おそらく、リフレクションを使用してそのクラスのメンバーのリストを取得し、そのリストからランダムに選択することができます。
実行時にできることは何も考えられません。アドレス整数の配列を作成し(これR.drawable.xxxx
は本質的に整数アドレスであるため)、java.util.Random
配列からランダムなリソースアドレスを選択するために使用できます。
X個の画像から選択できることがわかっている場合は、random.nextInt(X)を使用して0(包括的)からX(排他的)までの整数をランダムに生成し、それをオンにしてリソースを選択します。
Random mRand = new Random();
int x = mRand.nextInt(8);
switch (x) {
case 0:
mResource = R.id.someresource1
case 1:
mResource = R.id.someresource2
...
case X:
mResource = R.id.someresourceX
}
AssetManagerを使用したことはありませんが、ResourcesクラスでgetAssetsを呼び出してから、リソースの場所を使用してAssetManagerのリストを呼び出すことができますか?
XMLファイルを設定してもかまわない場合は、を使用して乱数を使用して電話をかける<level-list>
ことができるはずです。LevelListDrawable
setImageLevel()
ファイルを追加するときにこのリストを変更したくない場合は、このファイルをプログラムで生成できるビルドイベントを設定する方法があると思います。
私はApplezアプリケーションでこれを次のように行いました。
1)画像を保持するArrayListを作成し、それを埋めます2)乱数を取得し、対応する画像を返します。
コードで:
public static void fruitInventory() {
fruitResources.clear();
Field[] fields = R.drawable.class.getFields();
for (Field field : fields) {
// Take only those with name starting with "fr"
if (field.getName().startsWith("fr_")) {
try {
String FType = field.getName().substring(3);
fruitResources.add(field.getInt(null));
alfruitTypes.add(FType);
Log.d("FruitManager", "Type " + FType);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
と果物を追加するには:
public static void addFruit(Context context){
fruitInventory();
for (int i = 0; i < 10; i++) {
Random Rnd = new Random();
int FruitType = Rnd.nextInt(fruitResources.size());
GameObject nextApple = new GameObject(BitmapFactory.decodeResource(context.getResources(),
fruitResources.get(FruitType)), FruitType);
MainGamePanel.AppleList.add(nextApple);
}
}
たとえば「fr_eggplant.bmp」を画像フォルダに追加するだけで、ゲームに果物を追加できるというアイデアがありました(そして機能します)。