Я хочу отобразить случайное изображение от набора изображений, которые я сохранил в res/drawable.
Единственная техника, которую я знаю, состоит в том, чтобы получить доступ к конкретному изображению, если Вы знаете его идентификатор ресурса. Существует ли способ получить доступ к изображениям при помощи имен файлов или чего-то еще (который может быть создан во времени выполнения)?
Я хочу случайным образом выбрать изображение во времени выполнения. Любые предложения/идеи ценятся :)
Спасибо Chinmay
Вы также можете получить доступ к ресурсам по имени, что может быть жизнеспособным подходом к решению вашей проблемы, если вы знаете имена ресурсов или можете получить их в соответствии с некоторой заранее определенной схемой именования.
Вы должны сопоставить имя с идентификатором, используя метод getIdentifier класса Resources
.
String name = "resource" + rng.nextInt(count);
int resource = getResources().getIdentifier(name, "drawable", "com.package");
В документации к этому методу сказано:
Примечание: использование этой функции является обескуражен. Это намного эффективнее получать ресурсы по идентификатору чем по имени.
Это правда, но это не должно быть проблемой, если вы делаете это в коде, не зависящем от производительности.
В качестве альтернативы, если вы не против перечислить ресурсы в XML, вы можете создать типизированный массив , из которого затем можно будет произвольно выбирать.
Элементы в res/drawable перечисляются в классе R.drawable во время компиляции. Возможно, вы могли бы использовать reflection, чтобы получить список членов этого класса, а затем выбрать из этого списка случайным образом.
Я не могу придумать, что можно сделать во время выполнения. Возможно, вы можете создать массив целых чисел адресов (поскольку R.drawable.xxxx
по сути является целым адресом) и затем использовать java.util.Random
для выбора случайного адреса ресурса из вашего массива.
Если бы вы знали, что у вас есть 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
}
Я никогда не использовал AssetManager, но сможете ли вы вызвать getAssets в своем классе Resources, а затем вызвать список AssetManager с указанием местоположения ваших ресурсов?
Если вы не против создания
XML файла, вы должны быть в состоянии использовать LevelListDrawable
и вызвать setImageLevel()
с вашим случайным числом.
Если вы не хотите изменять этот список при добавлении файлов, я предполагаю, что существует способ настройки события сборки, при котором вы можете автоматически генерировать этот файл.