Галерея AndroidПросмотреть утилизацию - PullRequest
2 голосов
/ 17 октября 2011

Я использую GalleryView с ~ 40 изображениями, и так медленно, потому что без переработки ...

Любой может показать мне базовую переработку до GalleryView по getView методу.

public class ImageAdapter extends BaseAdapter {
    int mGalleryItemBackground;
    private Context mContext;

    private Integer[] mImageIds = {
            R.drawable.sample_1,
            R.drawable.sample_2,
            R.drawable.sample_3,
            R.drawable.sample_4,
            R.drawable.sample_5,
            R.drawable.sample_6,
            R.drawable.sample_7
    };

    public ImageAdapter(Context c) {
        mContext = c;

        TypedArray a = c.obtainStyledAttributes(R.styleable.HelloGallery);
        mGalleryItemBackground = a.getResourceId(
                R.styleable.HelloGallery_android_galleryItemBackground, 0);
        a.recycle();
    }

    public int getCount() {
        return mImageIds.length;
    }

     public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(mContext);

        i.setImageResource(mImageIds[position]);
        i.setLayoutParams(new Gallery.LayoutParams(150, 100));
        i.setScaleType(ImageView.ScaleType.FIT_XY);
        i.setBackgroundResource(mGalleryItemBackground);

        return i;
    }
}

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Вместо создания нового ImageView в getView вы должны преобразовать convertView в нужный вам вид.Вот пример одного из способов сделать это:

public View getView(int position, View cv, ViewGroup parent) {

    if (! convertView istanceof ImageView)
    {
        ImageView cv = new ImageView(mContext);
        cv.setLayoutParams(new Gallery.LayoutParams(150, 100));
        cv.setScaleType(ImageView.ScaleType.FIT_XY);
        cv.setBackgroundResource(mGalleryItemBackground);

    }
    cv.setImageResource(mImageIds[position]);

    return cv;
}

Просто преобразуйте convertView, чтобы он соответствовал тому, что вы хотите, но сначала убедитесь, что это правильный тип представления.

Обновление : Вы также должны уменьшить изображения перед их отображением.Предположим, что у вас есть изображение размером 500x500 пикселей, сохраненное в res/drawable, но изображение будет занимать только 125x125 пикселей на экране.Вам нужно уменьшить изображение перед его отображением.Чтобы узнать, сколько вам нужно уменьшить изображение, вы должны сначала получить его размер

int maxSize = 125; // make 125 the upper limit on the bitmap size
int resId; // points to bitmap in res/drawable

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true; // Only get the bitmap size, not the bitmap itself
BitmapFactory.decodeResource(c.getResources(), resId, opts);

int w = opts.outHeight, h = opts.outHeight;
int maxDim = (w>h)?w:h; // Get the bigger dimension

Теперь, когда у нас есть размер, рассчитайте, сколько нужно уменьшить изображение.Если у нас есть растровое изображение 500x500, и мы хотим растровое изображение 125x125, мы сохраняем 1 из каждых 4 пикселей, которые мы получаем из int inSample = 500/125;

int inSample = maxDim/maxSize; 

opts = new BitmapFactory.Options();
opts.inSampleSize = inSample;

Теперь просто декодируйте ресурсы, и у нас есть наше растровое изображение с пониженной выборкой.

Bitmap b = BitmapFactory.decodeResource(c.getResources(), resId, opts);

Имейте в виду, что исходное растровое изображение не изменяется.Вы можете снова декодировать изображение и установить opts.inSampleSize на 1, и вы получите все 500x500 растровое изображение.

4 голосов
/ 17 октября 2011

Виджет Галерея на самом деле содержит ошибку, из-за которой он всегда возвращает нулевое значение convertView. Это означает, что даже если вы реализуете метод getView, использующий convertView, вы не получите повышения производительности, потому что он всегда будет создавать новый.

Проверить этот ответ

Для одного возможного решения. Этот человек в основном взял виджет «Галерея» и внес в него необходимые исправления. Вы можете скачать EcoGallery и включить ее в свой собственный пакет, чтобы вы могли использовать виджет галереи, который корректно перерабатывается. Вы можете использовать следующие варианты: (1) Реализуйте свою собственную логику для хранения и использования кэша объектов View. (2) Найдите другую комбинацию виджетов «Вид» для достижения эффекта, подобного галерее, и используйте их вместо фактического виджета галереи.

Обратите внимание, что если вы решите загрузить эту EcoGallery, вам понадобятся 3 java-файла, перечисленных на сайте, и вам нужно будет взять 2 разных xml-файла из вашего sdk и включить их в ваш проект.

...