Відображення зображень у вашому інтерфейсі користувача, Навчальний курс з розробки Android

Цей урок навчить вас

Цей урок поєднує всі попередні уроки, показуючи вам, як завантажити кілька растрових зображень у ViewPager та GridView компоненти за допомогою фонового потоку та використовуючи кеш растрових зображень, опрацьовуючи проблеми паралелізму та зміни конфігурації.

Завантаження растрових зображень на реалізацію ViewPager

Шаблон переміщення уявлень є відмінним способом для переміщення за докладним уявленням галереї зображень. Ви можете реалізувати цю модель за допомогою ViewPager компонент за допомогою PagerAdapter. Тим не менш, більше підходить один з підкласів адаптера FragmentStatePagerAdapter , який автоматично знищує та зберігає стан Fragments у ViewPager , як тільки вони зникають з екрана, зберігаючи низький обсяг пам'яті, що використовується.

Примітка: Якщо у вас є невелика кількість зображень і впевнені, всі вони помістилися в межах пам'яті програми, то використання звичайного PagerAdapter або FragmentPagerAdapter може бути доцільним.

Ось реалізація ViewPager із ImageView дочірніми елементами. Основна діяльність утримує ViewPager та адаптер:

Ось реалізація детального Fragment , який містить ImageView батьківські уявлення. Це може здатися цілком розумним підходом, але ви можете побачити недоліки цієї реалізації? Як це можна покращити?

Сподіваюся ви помітили проблему: зображення вичитуються з ресурсів у потоці інтерфейсу користувача, що може призвести до зависання програми і воно буде примусово закрито. Використовуйте AsyncTask , як описано в уроці Обробка растрових зображень поза потоком інтерфейсу користувача , це простоперемістить завантаження та обробку зображень у фоновий потік:

Будь-яка додаткова обробка (наприклад, зміна розміру або вилучення зображень з мережі) може відбуватися в BitmapWorkerTask, не торкаючись реакції головного інтерфейсу користувача. Якщо фоновий потік робить більше, ніж просто завантаження зображення безпосередньо з диска, то також може бути корисно додати кеш пам'яті та/або дисковий кеш, як описано в кешування растрових зображень. Ось додаткові модифікації для кеш-пам'яті:

Зіставлення всіх цих частин разом дає чуйну ViewPager реалізацію з мінімальною затримкою при завантаженні зображень, і здатність робити обробку зображень у фоновому потоці за необхідності.

Завантаження растрових зображень на реалізацію GridView

Будівельний блок Сітка корисний для відображення наборів зображень і може бути реалізований за допомогою GridView компонента, в якому багато зображень може бути на екрані в будь-який момент часу та багато інших готових з'явитися, якщо користувач прокручує вгору або вниз. При реалізації цього типу управління, ви повинні переконатися, що інтерфейс користувача залишається плавним, використання пам'яті залишається під контролем і паралелізм правильно обробляється (завдяки здатності GridView переробляти свої дочірні уявлення).

Для початку, тут стандартна GridView реалізація з ImageView дочірніми уявленнями, вміщеними всередину Fragment . Знову ж таки, це може здатися цілком розумним підходом, але як би зробити ще краще?

Ще раз, проблема з цієї реалізації в тому, що зображення задається в потоці інтерфейсу користувача. Хоча це може працювати для невеликих, простих зображень (завдяки завантаженню системних ресурсів такешування), але якщо необхідна будь-яка додаткова обробка, то ваш інтерфейс користувача зі скрипом зупиниться.

Асинхронна обробка та методи кешування з попереднього розділу можуть бути реалізовані тут. Тим не менш, ви також повинні побоюватися проблем паралелізму, оскільки GridView переробляє свої дочірні уявлення. Щоб вирішити ці проблеми, використовуйте методи, описані в уроці Обробка растрових зображень поза потоком інтерфейсу користувача . Ось оновлене рішення:

Примітка: Той самий код може бути легко адаптований для роботи з ListView.

Ця реалізація забезпечує гнучкість в тому, як зображення обробляються і завантажуються, не перешкоджаючи плавності інтерфейсу користувача. У фоновому режимі можна завантажити зображення з мережі, або змінювати розмір великих фотографій з цифрової камери, і зображення відображаються як тільки завдання закінчує обробку.

Повний приклад цього та інших принципів, що обговорюються в цьому уроці, шукайте приклад прикладу прикладеного.