Советы по ускорению виджета Галерея в 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 мс для каждого файла.

Поскольку файловый ввод-вывод обычно выполняется в потоке пользовательского интерфейса, это вызовет очень заметный "хик" в любом продолжающемся переходе фотографии.

Чтобы избежать этого, вы должны:

  1. Установить временную загрузочную отрисовку, которая уже кешируется imageView.setImageResource(R.drawable.my_loading_drawable);
  2. Создайте AsyncTask, который
    • загружает отрисовку в doInBackground(т. е. файловый ввод / вывод)
    • Обновляет imageView в onPostExecute imageView.setImageDrawable (drawable);

PS, если пользователь перелистывает несколько изображений, описанный выше подход, как правило, запускает несколько параллельных асинхронных задач, которые все будут использовать файловый ввод / вывод. Не хорошо для производительности и может привести к сбою вашего приложения. Вероятно, у вас должен быть более структурированный подход, когда вы разрешаете только одну асинхронную задачу за раз.

Включение аппаратного ускорения вашего приложения окажет существенное влияние (по крайней мере, оно имело место в моем примере приложения).

Добавьте android:hardwareAccelerated="true" в элемент приложения вашего манифеста Android: http://developer.android.com/guide/topics/manifest/application-element.html

Другие вопросы по тегам