4

В настоящее время я создаю приложение для показа изображений с SD-карты. В основном вы делаете альбом и добавляете к нему картинки, будь то камера камеры MediaStore.Как реализовать галерею изображений (локальные изображения)

Я попытался реализации 2 метода:

  1. Стандартная галерея приложение с пользовательским BaseAdapter, чтобы возвратить представление
  2. ViewPager с пользовательскими PagerAdapter

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

Atm оба метода работают в портретном режиме. Когда я переключаюсь на пейзаж, некоторые изображения просто снижаются.

03-20 12:20:56.515: W/OpenGLRenderer(17398): Bitmap too large to be uploaded into a texture 

с последующим ошибками памяти. Переполнение стека, если оно полна проблем с OOM и галереей, вы должны перерабатывать представления, чтобы заставить их работать, потому что convertView всегда имеет значение null в getView из BaseAdapter.

Так что я использовал ресайлер для просмотра, я ограничиваю его до 2 просмотров и портретного режима, работающего на метод 1 (используя галерею). Пейзаж все еще дает мне ту же проблему.

Для метода 2 (viewflipper) он обрабатывает мнения от

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 

Wich никогда не называют кстати ... Однако портретный режим работы здесь. Пейзаж все еще падает.

Мой метод для получения растрового изображения:

public static Bitmap getBitmap(Context ctx, int imageId, ImageView target) { 

    String file = getPath(ctx, imageId); 

    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 

    BitmapFactory.decodeFile(file, bmOptions); 
    WindowManager mgr = (WindowManager)   ctx.getSystemService(Context.WINDOW_SERVICE); 

    int scaleFactor = 1; 

    if (mgr != null) { 
     // Get the dimensions of the View 
     int targetW = mgr.getDefaultDisplay().getWidth(); 
     int targetH = mgr.getDefaultDisplay().getHeight(); 
     Log.d(TAG, "Image width + height=" + targetW + "," + targetH); 


     int photoW = bmOptions.outWidth; 
     int photoH = bmOptions.outHeight; 
     // Determine how much to scale down the image 
     scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

    } else { 
     Log.d(TAG, "Target is null"); 
    } 

    // Get the dimensions of the bitmap 
    // Decode the image file into a Bitmap sized to fill the View 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 
    logHeap(ImageHelper.class); 

    Bitmap bm = BitmapFactory.decodeFile(file, bmOptions); 

    if (target != null) { 
     target.setImageBitmap(bm); 
    } 
    return bm; 
} 

работает хорошо, я знаю, я использовать оконный менеджер, чтобы получить, но это Размер экрана является потому, что мой ImageView еще размер (0,0), когда я надуть , После этого я называю

imgView.setLayoutParams(new Gallery.LayoutParams(
      Gallery.LayoutParams.FILL_PARENT, 
      Gallery.LayoutParams.FILL_PARENT)); 
    imgView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

Ничто, кажется, работает ...

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

Не могли бы вы помочь мне со следующими вопросами?

  1. Есть ли способ сделать галерею по умолчанию сразу в полноэкранном режиме и заблокировать сетку? Таким образом, мне нужен только адаптер для предоставления изображений вместо создания моих собственных представлений. (возможно, это решает ошибки OOM)
  2. Является ли моя функция декодирования растрового изображения в порядке? Нужно ли мне создавать какие-то хаки, чтобы поймать изменения ландшафта?
  3. Каков наилучший способ сделать нужную мне галерею, используя просмотрщик или галерею?
  4. Есть ли у кого-нибудь пример кода полноэкранной галереи, которая не сбой?
+0

Вы пытаетесь создать галерею или попытаться получить доступ к галерее? Также логика декодирования выглядит нормально. – lokoko

ответ

1

Это проблема, с которой я столкнулся несколько раз в прошлом. Google опубликовал статью об этом.

Проблема в inSampleSize, которую вы используете для декодирования изображения. Поскольку разные устройства имеют разные экраны и размеры памяти (размеры кучи VM, которые могут составлять от 12 до 64 или более Мбайт), вы не можете декодировать изображения одинаково во всех из них. Например, изображение в устройстве 320x240 с памятью кучи 12 Мб должно иметь заданный параметр inSampleSize, в то время как устройство памяти кучи памяти 1280x720 64Mb должно использовать еще один inSampleSize (более крупный).

В статье i attack показан эффективный способ визуализации изображений для заданной высоты и ширины. Обратите особое внимание на последний сегмент кода, они «предварительно открывают» файл и вычисляют inSampleSize для «полного декодирования» позже.

Я также хотел бы добавить эти рекомендации.

  1. Используйте функцию «getBitmap» в асинхронном образом, вызвать новый поток или AsyncTask (это делается потому, что с помощью SD занимает много времени, и это заставит ваше приложение, чтобы повесить, чтобы быть медленным и дать плохое впечатление на устройствах с низким и средним уровнем.

  2. Старайтесь всегда использовать один и тот же объект Bitmap. Избегайте создания нескольких битмапов Bitmap = new Bitmap(). Вы должны понимать, что загруженные растровые изображения сохраняются в ram и однажды назначены чтобы увидеть его «сложнее» для сборщика мусора, чтобы получить их.

  3. Когда вы закончите использовать битму p over сделать его нулевым. Это из этого, представьте, что у вас есть оперативная память объемом в 12 Мб. ваше приложение использует 8Mb сейчас. Собиратель мусора запускается и не может получить больше неиспользуемой ОЗУ. вы 10 Bitmaps fast никогда не делаете их null после назначения данных ImageView и каким-то образом вы сохраняете их ссылку. Взято, что каждый растровый рисунок принимает 500Kb Рама, на которое ваше приложение рухнет. Всегда используйте Bitmaps null после использования.

  4. Наконец, используйте DDMS, предусмотренные в инструментах платформы google (вы можете получить доступ к нему с помощью eclipse для отладки и посмотреть использование вашей памяти, вы также можете заставить Garbage Collection увидеть, как ведет себя ваше приложение).

Смежные вопросы