Android: быстрый слайдер изображений с * правильно повернутыми * изображениями

Существует множество примеров использования ViewPager в качестве слайдера изображений, но я не видел ни одного, который бы справлялся с проблемой правильно повернутых изображений:

Теперь на самом деле у меня есть решение для этого, но проблема в том, что скольжение изображения мучительно медленно, когда размер изображения превышает 3000*1500 пикселей из-за дополнительного шага вращения:

Сам ImageView не заботится о правильной ориентации при установке изображения с помощью setImageURI или setImageBitmap.

Это означает, что вы сначала должны выяснить правильную ориентацию самостоятельно, а затем в конечном итоге сделать

matrix.postRotate(rotation) 

и создать новое растровое изображение, используя

Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(),
                srcBitmap.getHeight(), matrix, true);

Это дополнительное создание растрового изображения действительно замедляет его.

Если бы был способ загрузки изображения, "повернутого на лету"? STH. как BitmapFactory.decodeStream(поток, матрица)?

Я также пытался увеличить значение ViewPager.setOffscreenPageLimit до 3, но в результате ошибки "java.lang.OutofMemoryError: размер растрового изображения превышает бюджет ВМ".

Каким-то образом это должно быть возможно, потому что в стандартном приложении "Галерея" скольжение происходит очень быстро даже с очень большими изображениями... Но я полагаю, это не тривиальная задача?

1 ответ

Решение

Наконец, я нашел решение: чтобы получить быстрое и плавное скольжение изображения, нужно сделать две вещи:

  1. Выполните загрузку растрового изображения в фоновом режиме, используя AsyncTask https://developer.android.com/training/displaying-bitmaps/process-bitmap.html

  2. Загрузите версию растрового изображения с уменьшенной выборкой, используя BitmapFactory.Options.inSampleSize (рассчитывается с использованием соотношения между размерами ViewPager и Bitmap)

    https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

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