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)?
- ¿Cómo puedo hacer que una imagen se agite / se mueva cuando se hace clic?
- ¿Existe alguna diferencia entre / mnt / sdcard y / sdcard?
- Galería abierta de Android desde la carpeta
- Cómo obtener todas las imágenes y fotos de mi dispositivo android no de sdcard?
- Cómo crear un ImageView circular en Android?
Quiero seleccionar aleatoriamente una imagen en tiempo de ejecución. Cualquier sugerencia / ideas apreciadas 🙂
Gracias Chinmay
- Mostrar imágenesVistas con tema de animación
- Cargar foto en la galería como objeto de mapa de bits en Android
- Dimensiones grandes de la imagen de la notificación de Android
- Imagen 9patch con sólo escala horizontal
- Java.io.IOException: BufferedInputStream está cerrado
- Recortar parte particular de la imagen en android
- Convertir la matriz de bytes de 4 bits en escala de grises a Bitmap Android
- Acceder a imágenes de la aplicación Fotos en mi aplicación Android
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!
-
Cree un recurso de matriz que incluya todas las imágenes de las que desee elegir.
res/values/arrays.xml
esto en mi archivores/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>
-
A continuación, obtenga el
TypedArray
de losResources
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();
-
¡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.
- ¿Necesito un teléfono Android para crear aplicaciones de Android?
- ¿Cómo detectar el botón de retroceso de SearchView?