Создание ImageViews для галереи, которые соответствуют высоте галереи в Android - PullRequest
0 голосов
/ 14 июля 2011

Я хочу создать галерею, которая отображает очень большое количество изображений. Для этого я создал класс адаптера с ImageView [3] и заставил getView раздать ImageView [position% 3]. Я также настраиваю адаптер для заполнения ImageView большими растровыми изображениями, которые загружаются асинхронно.

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

Поэтому моя проблема удручающе тривиальна: ImageView не масштабируется так, как я хочу. Желательно, чтобы ImageView был такой же высоты, как и его родитель, но с тем же соотношением сторон, что и его содержимое. Однако, если я заполню ImageView [], используя этот код:

    private void initializeStaticArrays() {
        //initialize envelope arrays
        for(int i=0; i<ENVELOPE_ARRAY_SIZE; ++i)
        {
            mEnvelopeViews[i] = new ImageView(mContext);
//make the views as wide as their content and as tall as their parent
            mEnvelopeViews[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
//then make them scale the contained image
            mEnvelopeViews[i].setScaleType(ImageView.ScaleType.FIT_CENTER);
            mEnvelopeIds[i] = Gallery.INVALID_POSITION;
            mBundles[i] = new BitmapFilePathBundle();
        }
        for(int i=0; i<THUMBNAIL_ARRAY_SIZE; ++i)
        {
            mThumbnailViews[i] = new ImageView(mContext);
            if(mThumbnailParams!=null) mThumbnailViews[i].setLayoutParams(new Gallery.LayoutParams(mThumbnailParams));
            mThumbnailViews[i].setScaleType(ImageView.ScaleType.FIT_CENTER);
            mThumbnailIds[i] = Gallery.INVALID_POSITION;
        }
    }

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

Итак: есть ли способ сделать ImageView таким же высоким, как его родитель, с масштабированием его содержимого, чтобы соответствовать ему с правильным соотношением сторон, и с шириной ImageView, точно совпадающей с шириной содержимого?

Редактировать: сбой был вызван CastException из LayoutParams в Gallery.LayoutParams. Изменение соответствующей строки на это:

//make the views as wide as their content and as tall as their parent
            mEnvelopeViews[i].setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));

исправляет сбой, но все еще не решает проблему масштабирования.

1 Ответ

0 голосов
/ 13 октября 2011

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

...