Советы по ускорению виджета Галерея в Android Honeycomb
Я ищу отличный способ ускорить виджет просмотра галереи в Android Honeycomb. В настоящее время я использую его для отображения довольно больших изображений размером примерно 340 x 600 пикселей, и я бы хотел, чтобы он был плавным, как масло при прокрутке изображений.
Это довольно быстро в данный момент, но это не сравнимо с загрузкой ScrollView с ImageViews и прокруткой.
Вот упрощенная версия моего getView()
метод из моего пользовательского BaseAdapter:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = (ImageView) new ImageView(Main.this);
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
((ImageView) convertView).setImageBitmap(createReflection(BitmapFactory.decodeFile(ImageFile, options)));
convertView.setPadding(20, 0, 20, 0);
return convertView;
}
Я экспериментировал с ленивой загрузкой изображений, но мне не очень понравился результат.
4 ответа
Разница между использованием Gallery
а также:
загрузка ScrollView с ImageViews и прокрутка этого
это с ScrollView
Сценарий, вы предварительно загружаете все изображения, а не загружаете их на лету, как в Gallery
сценарий.
Если у вас мало изображений, и у вас достаточно оперативной памяти для поддержки всех из них, просто используйте ScrollView
,
Помимо этого, AFAIK, вы не можете сделать ни тонны. Вы можете поддерживать кэш растрового изображения, в котором вы продолжаете декодировать несколько изображений перед текущими в Gallery
и ваш Adapter
вытащить из кеша. Однако, это только поможет вам - небольшие прокрутки будут гладкими, но отклонение от объема кеша все равно приведет к декодированию, выполняемому по требованию. Это в значительной степени неизбежно.
Галерея не поддерживает convertView в данный момент. Вы всегда получите null для convertView. Это известная проблема, и ETA для исправления не существует.
Одним из элементов, замедляющим просмотр галереи, является файловый ввод-вывод. Я работаю над приложением слайд-шоу, для которого у меня есть фотографии в разрешении 1280x720. Фактический файловый ввод / вывод занимает 300-400 мс для каждого файла.
Поскольку файловый ввод-вывод обычно выполняется в потоке пользовательского интерфейса, это вызовет очень заметный "хик" в любом продолжающемся переходе фотографии.
Чтобы избежать этого, вы должны:
- Установить временную загрузочную отрисовку, которая уже кешируется imageView.setImageResource(R.drawable.my_loading_drawable);
- Создайте AsyncTask, который
- загружает отрисовку в doInBackground(т. е. файловый ввод / вывод)
- Обновляет imageView в onPostExecute imageView.setImageDrawable (drawable);
PS, если пользователь перелистывает несколько изображений, описанный выше подход, как правило, запускает несколько параллельных асинхронных задач, которые все будут использовать файловый ввод / вывод. Не хорошо для производительности и может привести к сбою вашего приложения. Вероятно, у вас должен быть более структурированный подход, когда вы разрешаете только одну асинхронную задачу за раз.
Включение аппаратного ускорения вашего приложения окажет существенное влияние (по крайней мере, оно имело место в моем примере приложения).
Добавьте android:hardwareAccelerated="true" в элемент приложения вашего манифеста Android: http://developer.android.com/guide/topics/manifest/application-element.html