2013-01-21 1 views
15

Я создаю очень базовую галерею на android, она показывает последнее изображение в папке камеры, и пользователь может скользить влево, чтобы увидеть предыдущий.Android, как сделать изображение слайд экрана?

Я закончил реализацию с помощью viewpager и pagerAdapter, используя sampleSize для масштабирования изображений. Моя проблема в том, что реализация нигде не эффективна, как приложение галереи по умолчанию, каждый раз, когда вы перемещаете изображение, вам нужно подождать около 200 мс для следующей загрузки. Поэтому в основном моя идея о том, как ее реализовать, не работает.

Как я могу сделать это эффективно и, если возможно, с реализацией, которая позволяет в дальнейшем увеличивать или уменьшать масштаб?


Это выглядит многообещающим, но я не знаю, как реализовать его с файлами вместо http://www.androidviews.net/2012/11/photoview/ вводимого коэффициента


EDIT:

мне удалось улучшить скорость немного с помощью photoview (взломанный просмотрщик), однако для преобразования файлов в растровые изображения или чертежи требуется слишком много.

Я пробовал эти два метода, предложенные dilix и iDroid Проводнике:

// Method A 
Drawable d = Drawable.createFromPath(imagePath); 
imageView.setImageDrawable(d); 

// Method B 
Bitmap myBitmap = BitmapFactory.decodeFile(imagePath); 
imageView.setImageBitmap(myBitmap); 

Но оба производят ошибку Bitmap too large to be uploaded into a texture. Мне нужно как можно быстрее получить изображение в ImageView и как-то обойти эту ошибку, и, может быть, я получу приличную скорость. Сейчас я масштабирую изображения и преобразовываю их в drawable, но это не очень эффективно.

+0

Вы можете использовать Галерея http://developer.android.com/reference/android/widget/Gallery.html –

+0

Вы должны знать, что отставание, которое вы замечаете, связано с опросом файлов! Итак, если вы заметили, что androidviews.net очень быстро, помните, что он использует чертежи, а не файлы изображений! –

ответ

3

Проверить этот удивительный сайт: http://www.androidviews.net/ и, возможно, это то, что вы хотите: http://www.androidviews.net/2012/11/photoview/

Он имеет прокрутки страниц, масштабирования и панорамирования, как вам нужно я использовал его в моем проекте с некоторыми изменениями и отложенной загрузки изображений , Он работает именно так, как вам нужно.

+1

Я только что протестировал его, он отлично работает. Но я изучал код и не вижу возможности реализовать его с файлами изображений вместо графических объектов. Я начну проверять, могу ли я объединить его с моей реализацией, но я не думаю, что это сработает. – lisovaccaro

+0

Я использую реализацию фотоизображения в сочетании с 'imageView.setImageDrawable (GetDrawable (imagePath, 150, 150));' для преобразования пути файла SD-карты в drawables. Однако он все еще неэффективен. Может быть, есть способ view.setImage с файловым путем? (Не требуется преобразование) – lisovaccaro

+0

Это приведет меня к правильному пути. Мне нужно выяснить, как делать ленивую загрузку изображений, и, возможно, изменить анимацию viewpager, если это возможно. – lisovaccaro

1

1)

This looks promising but I don't know how to implement it with files instead of drawables http://www.androidviews.net/2012/11/photoview/

Вы должны хранить не список в вас вводимого коэффициента адаптера, но ссылки на файлы на вашем сд карты, а затем загрузить его.

2) Но я могу представить, что файл вместо drawables не будет настолько эффективным, потому что для загрузки из файлов вам нужно проанализировать его с SD-карты.

Я думаю, что вы можете сэкономить время, одновременно загрузив несколько изображений в свою память (сжатый), и когда вы развернете свой образ, у вас уже будет изображение и память, а во время разыгрывания вы можете начать загрузку другого изображения в память.

При переходе по галерее вы можете не загружать изображения и загружать их после почти остановки.

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

UPDATE

Я думаю, что лучше, чем изучать это самостоятельно будет исследовать существующий код Google галереи: https://github.com/CyanogenMod/android_packages_apps_Gallery

Как я проверил - они хранят кэш (почти как я уже говорил о загрузке нескольких растровые изображения) и сохранять только измененные изображения - кажется, эффективны.

+0

Возможно, я неправильно понял ваш первый пункт, у меня есть список файлов в моем адаптере, но мне нужно преобразовать их в drawables, так как я не знаю другого способа добавить их в представление изображения. Я делаю что-то вроде этого ('imageView. setImageDrawable (GetDrawable (imagePath, 150, 150));). Есть ли способ отображать изображение без этого преобразования? Вероятно, это сэкономит массу ресурсов. – lisovaccaro

+0

Вы можете загрузить растровое изображение (сжатое, и вы можете загрузить, например, 3 сразу - текущее, предыдущее и следующее) и загрузить это растровое изображение в виде следующим образом: http://stackoverflow.com/questions/4181774/show-image-view-from-file-path-in-android – dilix

+0

Я просто попробовал реализацию из другого вопроса, но у меня возникла ошибка: «Растровое изображение слишком большое, чтобы быть загруженным в текстуру (2560x1920, max = 2048x2048) «Кажется, все равно. Связано ли это с компрессией? Я не знаю, как их загрузить, вы знаете, как обойти эту ошибку? – lisovaccaro

1

См. Официальную документацию для отличного примера, который позволит вам эффективно использовать растровые изображения с помощью viewpager. Вы должны использовать кеш изображений, которые уже были загружены, и изображения должны быть загружены за пределы потока пользовательского интерфейса. Вы также хотите масштабировать изображение до минимального размера, необходимого для вашего дисплея (обычно с двумя уровнями) - обратите внимание, что изображение не всегда будет масштабироваться до того, что вы просите!) ViewPager также загружает изображения в фоновом режиме для подготовки к следующий слайд, который устанавливается с помощью метода setOffScreenPageLimit (по умолчанию, как правило, хорошо, я думаю, что это 2.)

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

+0

Сначала я подумал, что пример ужасный, но он позволяет быстро сползать. На самом деле нужно начинать. Я посмотрю, смогу ли я его реализовать. – lisovaccaro

+0

Я пытаюсь загрузить файлы изображений для динамической загрузки, но кажется невозможным получить их внутри imageUrls, который является окончательным и статическим. Пожалуйста, проверьте, что я пробовал, может быть, вы можете найти решение: http://pastebin.com/raw.php?i=LDAwU7Mx – lisovaccaro

+0

Вы имели в виду позвонить pathsList, imageList? Тогда, поскольку imageUrls - это конечная переменная, вы можете назначить ее только один раз. Вы можете использовать 'public final static String [] imageUrls = imageList.toArray (new String [imageList.size()])' – ndw

1

Я не уверен, есть ли вы правильное решение или нет. Но если вы хотите продолжить с вашей собственной реализацией с данной ссылкой, то:

http://www.androidviews.net/2012/11/photoview/ //this link is given in your question 

И вы можете увидеть this SO о том, как преобразовать путь файла в к Drawable. Теперь вы получаете доступный ваш указанный файл и реализуете ссылку, которую вы указали.

Я думаю, что ссылка будет работать хорошо.

Не стесняйтесь комментировать.

+0

Я просто попробовал вашу идею (как путь к файлу, так и путь к файлу), но оба возвращают ту же ошибку: 'W/OpenGLRenderer (20913): битмап слишком большой, чтобы быть загруженным в текстуру. – lisovaccaro

+0

В тот момент, когда я использую photoview в сочетании с функцией aa, которая масштабирует растровое изображение перед его использованием, но я не думаю, что функция очень эффективна, Мне нужно быстрее получить файл для изображения. – lisovaccaro

+0

- изображение, поступающее из Интернета? –