как выбрать из ресурсов случайным образом (R.drawable.xxxx) - PullRequest
6 голосов
/ 17 августа 2010

Я хочу отобразить случайное изображение из набора изображений, которые я сохранил в res / drawable.

Единственный известный мне способ - получить доступ к определенному изображению, если вы знаете его идентификатор ресурса. Есть ли способ получить доступ к изображениям, используя имена файлов или что-то еще (что можно создать во время выполнения)?

Я хочу случайным образом выбрать изображение во время выполнения. Любые предложения / идеи приветствуются:)

Спасибо Chinmay

Ответы [ 8 ]

17 голосов
/ 07 января 2014

Я понимаю, что это очень старый вопрос, но хотел предложить хорошее решение для любого гуглера.

Доступ к ресурсам по имени гораздо менее эффективен, чем по 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. Прибыль!

5 голосов
/ 17 августа 2010

Вы также можете получить доступ к ресурсам по имени, что может быть жизнеспособным подходом к решению вашей проблемы, если вы знаете имена ресурсов или можете получить их в соответствии с некоторой предварительно определенной схемой именования.

У вас естьчтобы сопоставить имя с идентификатором, используя метод getIdentifier класса Resources.

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

В документации этого метода сказано:

Примечание: использование этой функции не рекомендуется.Гораздо эффективнее получать ресурсы по идентификатору, чем по имени.

Это верно, но это не должно быть проблемой, если вы делаете это в коде, который не чувствителен к производительности.

В качестве альтернативы, если вы не возражаете перечислить ресурсы в XML, вы можете создать типизированный массив , который затем можно произвольно выбрать из.

2 голосов
/ 17 августа 2010

Элементы в res / drawable перечисляются в классе R.drawable во время компиляции. Возможно, вы могли бы использовать отражение , чтобы получить список членов этого класса, а затем выбрать из этого списка случайным образом.

1 голос
/ 17 августа 2010

Я не могу придумать, что вы можете сделать во время выполнения. Вы можете создать массив целочисленных адресов (поскольку R.drawable.xxxx по сути является целочисленным адресом), а затем использовать java.util.Random для выбора случайного адреса ресурса из массива.

0 голосов
/ 09 февраля 2013

Я сделал это в своем приложении 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" в папку с изображениями.

0 голосов
/ 17 августа 2010

Если вы не против настроить <level-list> XML-файл, вы сможете использовать <a href="http://developer.android.com/intl/de/reference/android/graphics/drawable/LevelListDrawable.html" rel="nofollow noreferrer">LevelListDrawable</a> и позвонить <a href="http://developer.android.com/reference/android/widget/ImageView.html#setImageLevel(int)" rel="nofollow noreferrer">setImageLevel()</a> со своим случайным номером.

Если вы не хотитечтобы изменить этот список при добавлении файлов, я бы предположил, что есть какой-то способ настроить событие сборки, где вы могли бы сгенерировать этот файл программным способом.

0 голосов
/ 17 августа 2010

Я никогда не использовал AssetManager, но сможете ли вы вызвать getAssets для вашего класса Resources, а затем вызвать список в AssetManager с указанием местоположения ваших ресурсов?

0 голосов
/ 17 августа 2010

Если вы знали, что у вас есть 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

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...