如何随机选择资源(R.drawable.xxxx)

时间:2010-08-16 20:32:12

标签: android android-image

我想显示我存储在res / drawable中的一堆图像中的随机图像。

我知道的唯一技术是在知道其资源ID时访问特定图像。有没有办法通过使用文件名或其他东西(可以在运行时构建)来访问图像?

我想在运行时随机选择一个图像。任何建议/想法赞赏:)

由于 Chinmay

8 个答案:

答案 0 :(得分:16)

我意识到这是一个非常古老的问题,但希望为任何Google员工提供一个好的解决方案。

按名称访问资源的效率远低于id。资源系统的重点在于您不必解析名称,而是可以使用ID。

您需要做的是使用Array Resource类型。按照我的简单步骤!我制作随机图片......好玩!

  1. 创建一个包含您要选择的所有图像的数组资源。我把它放在我的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>
    
  2. 接下来,从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();
    
  3. 利润!

答案 1 :(得分:4)

您还可以按名称访问资源,如果您知道资源的名称或者可以根据某些预定义的命名方案派生它们,这可能是解决问题的可行方法。

您必须使用Resources类的getIdentifier方法将名称映射到标识符。

String name = "resource" + rng.nextInt(count);
int resource = getResources().getIdentifier(name, "drawable", "com.package");

此方法的文档说:

  

注意:使用此功能是   泄气。效率更高   按标识符检索资源   而不是名字。

这是正确的,但如果您在性能不敏感的代码中执行此操作,则无需成为问题。

或者,如果您不介意在XML中列出资源,可以创建a typed array然后随机选择。

答案 2 :(得分:2)

res / drawable中的项目在编译时在R.drawable类中枚举。您可以使用reflection获取该类成员的列表,然后随机选择该列表。

答案 3 :(得分:1)

我无法想到你在运行时可以做的任何事情。您可以创建一个地址整数数组(因为R.drawable.xxxx本质上是一个整数地址),然后使用java.util.Random从数组中选择一个随机资源地址。

答案 4 :(得分:0)

如果您知道有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

            }

答案 5 :(得分:0)

我从未使用过AssetManager,但您是否能够在Resources类上调用getAssets,然后使用资源的位置调用AssetManager上的list?

答案 6 :(得分:0)

如果您不介意设置<level-list> XML文件,则可以使用LevelListDrawable并使用随机数调用setImageLevel()

如果您不想在添加文件时更改此列表,我会假设有一些方法可以设置构建事件,您可以在其中逐步生成此文件。

答案 7 :(得分:0)

我在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”添加到images文件夹即可。