2015-03-20 2 views
0

За последние 10 часов я пытаюсь получить большое (40+) количество изображений (в формате ImageButton) на одном экране Android без ошибок в памяти. Деятельность, над которой я работаю, - это подборщик изображений для приложения для раскраски. Изображения имеют различные размеры в диапазоне (от 500 до 1200) x (от 500 до 1200), PNG (если это имеет значение).40+ ImageButtons на одном экране?

Я попытался:

  • Горизонтальная прокрутка Просмотр с изображениями добавляемых из кода. Результат медленный (я делаю это в потоке пользовательского интерфейса) и потребляет большое пространство памяти.
  • Горизонтальный вид прокрутки с изображениями, добавленными из кода через AsyncThread. Результат быстрый, но все еще потребляет большое пространство памяти. Мне нравится пользовательский интерфейс этого самого!
  • Сетка и вид списка - оба очень изменчивые (тестирование на первом Nexus 7). Использование памяти лучше.

Что я рассматриваю

  • View Пейджер - первые результаты выглядят лучше, чем Grid View с точки зрения производительности (я не закончил его в данный момент, чтобы оценить использование памяти, но она должна быть лучше от того, что Я понимаю). Тем не менее, мне не нравится пользовательский интерфейс и предпочитаю прокручиваемый список всех изображений.
  • Преобразование моих ресурсов в JPG (будет, что избавиться от байта прозрачности?)
  • Уменьшение массы изображения на макс 500x500px

Ни одно из решений не кажется столь же хорошо как приложение Android Photo Gallery доступна на всех устройства. Этот опыт - это то, что я хотел бы отразить. Понятия не имею, как это делается, хотя :(

Два вопроса.

  1. Что является лучшим способом, чтобы получить такую ​​вещь (40+ Изображения SCROLLABLE на одном экране) сделано? Неужели это действительно ViewPager? ScrollView с AsyncTask и хорошо продуманы разрешение изображения? что-то я еще не пробовал?
  2. Каков предел памяти я должен попытаться держать ниже? Глядя на Android heap size on different phones/devices and OS versions это, кажется, 256 МБ, что справедливо предположение?

Спасибо У вас отличный выходной!

PS. КСН все работает как шарм, когда я добавить все кнопки в целях прокрутки :(

+0

Рассмотрите возможность использования внешней библиотеки, такой как «Универсальный загрузчик изображений» или «Picasso» (http://square.github.io/picasso/), если вы загружаете их из Интернета. – EpicPandaForce

+0

40 изображений одновременно или нет? Это имеет значение. Было бы здорово, если вы покажете экран своего приложения. – eleven

+3

Почему вы пытаетесь загрузить изображение 500x500 на кнопку? Создайте эскиз более разумного размера (возможно, 50x50) и используйте его. Загрузите полноразмерное изображение, когда оно выбрано. –

ответ

3

Некоторые основные расчеты показывает вашу проблему:

40+ изображения при 1200x1200 = прибл 57MB, комментарии являются правильными вы должны субсемплировать (например, уменьшите изображение) или используйте библиотеку, такую ​​как Universal Image Loader. Преобразование в формат JPG не имеет значения. Это формат сжатого хранилища, память, необходимая для отображения пикселей, остается неизменной.

Существует Android-разработчик статья о Displaying Bitmaps Efficiently с образцом кода. Следующие шаги более подробно описаны в статье Android Bitmap Loading for Efficient Memory Usage.

Основные шаги в загрузке большого растрового изображения являются:

  • Определение требуемого размера (от известного размера или определения размера целевой View).
  • Используйте BitmapFactory класс, чтобы получить размер растрового изображения (набор inJustDecodeBounds в BitmapFactory.Options к истине).
  • Рассчитайте значение подвыборки и передайте его на BitmapFactory.OptionsinSampleSize.
  • Используйте BitmapFactory для загрузки растрового изображения с уменьшенным размером.
+0

Спасибо, я верю, что это будет способ продолжения. Знаете ли вы, не имеет значения использовать JPGs против PNG (прозрачный байт?) Или использовать ARGB4444/RGB565 против ARGB8888 при создании растрового изображения? – Piotr

Смежные вопросы