2010-08-16 4 views
6

Я хочу отобразить случайное изображение из группы изображений, которые я сохранил в res/drawable.Как выбрать из ресурсов случайным образом (R.drawable.xxxx)

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

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

Thanks Chinmay

ответ

3

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

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

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

документация для этого метода говорит:

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

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

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

1

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

+0

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

+0

Я считаю, что у Майры есть ответ. – bporter

2

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

+1

Я только что попробовал это и смог получить список имен ресурсов - для возврата их значения потребуется еще один шаг. Я смог увидеть, что отражение отразилось. Отличное предложение Майры! Вот строка кода для получения имен полей: java.lang.reflect.Field [] fields = R.drawable.class.getFields(); – bporter

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 

      } 
+0

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

0

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

0

Если вы не возражаете против создания XML-файла <level-list>, вы должны использовать LevelListDrawable и позвонить по номеру setImageLevel() со своим случайным числом.

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

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» к папке с изображениями.

12

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

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

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