В настоящее время я создаю приложение для показа изображений с SD-карты. В основном вы делаете альбом и добавляете к нему картинки, будь то камера камеры MediaStore.Как реализовать галерею изображений (локальные изображения)
Я попытался реализации 2 метода:
- Стандартная галерея приложение с пользовательским BaseAdapter, чтобы возвратить представление
- 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-карты или с камеры независимо от их качества. Очевидно, галерея должна иметь возможность обрабатывать столько изображений, сколько есть в каталоге.
Не могли бы вы помочь мне со следующими вопросами?
- Есть ли способ сделать галерею по умолчанию сразу в полноэкранном режиме и заблокировать сетку? Таким образом, мне нужен только адаптер для предоставления изображений вместо создания моих собственных представлений. (возможно, это решает ошибки OOM)
- Является ли моя функция декодирования растрового изображения в порядке? Нужно ли мне создавать какие-то хаки, чтобы поймать изменения ландшафта?
- Каков наилучший способ сделать нужную мне галерею, используя просмотрщик или галерею?
- Есть ли у кого-нибудь пример кода полноэкранной галереи, которая не сбой?
Вы пытаетесь создать галерею или попытаться получить доступ к галерее? Также логика декодирования выглядит нормально. – lokoko