В настоящее время я делаю приложение для показа изображений с SD-карты. По сути, вы создаете альбом и добавляете в него фотографии, будь то с камеры средства выбора MediaStore.
Я пытался реализовать 2 метода:
- Стандартное приложение галереи с пользовательским BaseAdapter для возврата вида
- Viewpager с пользовательским PagerAdapter
Я не хочу отображать сетку, поэтому она должна сразу перейти в полноэкранный режим. После этого я хочу отключить пролистывание влево и вправо и прослушивать только щелчки.
Атм оба метода работают в портретном режиме. Когда я переключаюсь в альбомную ориентацию, некоторые изображения просто сбрасывают
03-20 12:20:56.515: W/OpenGLRenderer(17398): Bitmap too large to be uploaded into a texture
сопровождается ошибками нехватки памяти. Переполнение стека, если оно переполнено проблемами с OOM и галереей, вы должны перезапустить представления, чтобы заставить их работать, потому что convertView всегда равен null в getView из BaseAdapter.
Поэтому я использовал утилиту для просмотра видов, я ограничил ее двумя видами, а портретный режим работал для метода 1 (с использованием галереи). Пейзаж все еще вызывает у меня ту же проблему.
Для метода 2 (viewflipper) он обрабатывает представления по
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Который никогда не называется кстати ... Однако здесь работает портретный режим. Пейзаж все еще падает.
Мой метод получения растрового изображения:
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);
Кажется, ничего не работает ...
Пожалуйста, обратите внимание, что я не использую Drawables или любые другие ресурсы, включенные в APK.
Эта галерея должна иметь возможность загружать изображения с SD-карты или с камеры в любом качестве, в котором они были сделаны. Очевидно, что галерея должна иметь возможность обрабатывать столько же изображений, сколько имеется в каталоге.
Может кто-нибудь помочь мне ответить на следующие вопросы?
- Можно ли как-нибудь сразу сделать галерею по умолчанию полноэкранной и заблокировать вид сетки? Таким образом, мне нужен только адаптер для предоставления изображений, а не для создания собственных представлений. (возможно это решает сбои OOM)
- В порядке ли функция декодирования растрового изображения? Мне нужно встроить некоторые хаки, чтобы ловить изменения ландшафта?
- Какой лучший способ создать нужную мне галерею, используя пейджер или галерею?
- У кого-нибудь есть пример кода полноэкранной галереи, который не вылетает?