Cómo seleccionar aleatoriamente los recursos (R.drawable.xxxx)

Quiero mostrar una imagen aleatoria del montón de imágenes que he almacenado en res / drawable.

La única técnica que sé es acceder a una imagen en particular si conoce su ID de recurso. ¿Hay una manera de acceder a las imágenes mediante el uso de los nombres de archivo o algo más (que se puede construir en tiempo de ejecución)?

Quiero seleccionar aleatoriamente una imagen en tiempo de ejecución. Cualquier sugerencia / ideas apreciadas 🙂

Gracias Chinmay

También puede acceder a los recursos por nombre, lo cual puede ser un método viable para resolver su problema si conoce los nombres de los recursos o puede derivarlos de acuerdo con un esquema de nomenclatura predefinido.

Tiene que asignar el nombre al identificador mediante el método getIdentifier de la clase Resources .

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

La documentación de este método dice:

Nota: se desaconseja el uso de esta función. Es mucho más eficiente recuperar recursos por identificador que por nombre.

Esto es cierto, pero no tiene por qué ser un problema si lo está haciendo en código que no es sensible al rendimiento.

Por otra parte, si no le importa enumerar los recursos en XML, puede crear una matriz con tipo que puede seleccionar de forma aleatoria.

Me doy cuenta de que esto es una vieja pregunta estupenda, pero quería proporcionar una buena solución para cualquier Googlers.

Los recursos de acceso por nombre son mucho menos eficientes que por id. El punto de todo el sistema de recursos es para que no tenga que resolver nombres, y puede usar ids en su lugar.

Lo que debe hacer es utilizar el tipo de recurso Array . Sigue con mis sencillos pasos! Hago imágenes al azar … ¡Diversión!

  1. Cree un recurso de matriz que incluya todas las imágenes de las que desee elegir. res/values/arrays.xml esto en mi archivo res/values/arrays.xml pero realmente puede ir a cualquier parte.

     <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. A continuación, obtenga el TypedArray de los Resources y utilícelo para elegir una imagen aleatoria.

     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. ¡Lucro!

Los elementos en res / drawable se enumeran en la clase R.drawable en tiempo de compilación. Probablemente podría utilizar la reflexión para obtener una lista de los miembros de esa clase y, a continuación, seleccione de esa lista de forma aleatoria.

No puedo pensar en nada que puedas hacer en tiempo de ejecución. Puede crear una matriz de enteros de dirección (ya que el R.drawable.xxxx es esencialmente una dirección de entero) y luego utilizar java.util.Random para seleccionar una dirección de recurso aleatoria de su matriz.

Si supieras que tenías imágenes de X para elegir, podrías usar random.nextInt (X) para generar aleatoriamente un número entero entre 0 (inclusive) y X (exclusivo), luego activarlo para elegir tu recurso:

 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 } 

Nunca he utilizado AssetManager, pero ¿podría llamar a getAssets en su clase de recursos y, a continuación, lista de llamadas en AssetManager con la ubicación de sus recursos?

Si no te importa establecer un archivo XML <level-list> , deberías poder usar un LevelListDrawable y llamar a setImageLevel() con tu número aleatorio.

Si no desea cambiar esta lista cuando agrega archivos, asumiría que hay alguna forma de configurar un evento de compilación en el que podría generar este archivo de forma progmática.

Hice esto en mi aplicación de Applez como sigue;

1) crear un ArrayList para contener imágenes y llenarlo 2) tomar el número aleatorio y devolver la imagen correspondiente.

en codigo :

 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(); } } } 

Y para agregar la fruta:

 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); } 

}

Idea fue (y funciona) que podría agregar más frutas al juego, simplemente agregando por ejemplo "fr_eggplant.bmp" a la carpeta de imágenes.

  • Cómo ocultar fotos de la galería y guardarlas en mi aplicación
  • Imagen de escala de Android de setImageBitmap
  • Androide galería circular?
  • Acceder a una imagen dinámicamente desde la carpeta res android
  • ¿Cómo obtengo el identificador de recurso de una imagen si conozco su nombre?
  • Desactivar la optimización de recursos / imágenes / png de Android
  • ¿Cómo verificar el desarrollo (digital) de píxeles perfectos en Android?
  • Guardar imagen en sdcard desde un recurso de drawble en Android
  • Seleccionar miniatura de la galería de Android
  • Cómo borrar un ImageView en Android?
  • Cómo seleccionar varios archivos en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.