很棘手的问题,关于gridview加载图片
  • 1. * 我的问题是用画布标记已经选中的图片,选中之后如果不重用view被选中的状态划过去再划过来是存在的,如果重用的话就会内存溢出,下面是我的代码,请哪位大帮忙看一看。
package com.yonyou.uap.um.control.image;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.yonyou.uap.um.animation.UMAnimatorUpdateListener;
import com.yonyou.uap.um.base.UMAttributeHelper;
import com.yonyou.uap.um.control.ImageSelector;
import com.yonyou.uap.um.core.UMActivity;
import com.yonyou.uap.um.util.BitmapUtil;

public class ImageSelectorAdapter extends BaseAdapter {

    private static final String TAG = ImageSelectorAdapter.class.getName();
    public static final float SCALE = 0.92f;
    private List<ImageItem> mImages = null;
    private Context mContext = null;

    private static Bitmap select_icon = null;
    private static Paint select_paint = null;

    private ImageSelector mControl = null;

    static {
        select_icon = Bitmap.createScaledBitmap(
                BitmapUtil.getBitmapFromSrc("", "icon_data_select.png"),
                UMAttributeHelper.getSize(30 + ""),
                UMAttributeHelper.getSize(30 + ""), true);
        select_paint = new Paint();
        select_paint.setColor(Color.RED);
        select_paint.setStyle(Paint.Style.STROKE);
        select_paint.setStrokeWidth(4);
    }

    public ImageSelectorAdapter(Context ctx, ImageSelector control,
            List<ImageItem> images) {
        if (ctx == null) {
            throw new Error("ctx is null");
        }
        mControl = control;
        mImages = images;
        if (mImages == null) {
            mImages = new ArrayList<ImageItem>();
        }
        mContext = ctx;
    }

    @Override
    public int getCount() {
        int count = 0;
        if (mImages != null) {
            count = mImages.size();
        }
        return count;
    }

    @Override
    public Object getItem(int position) {
        return mImages.get(position);
    }

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

    private Set<Integer> selectedItems = new HashSet<Integer>();
    private HashMap<Integer, ImageViewItem> mCache = new HashMap<Integer, ImageViewItem>();

    @SuppressLint("NewApi")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageViewItem rs = null;
        if (mCache.containsKey(position)) {
            rs = mCache.get(position);
        } else {
            rs = this.new ImageViewItem(mContext);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
                rs.setId(View.generateViewId());
            } else {
                rs.setId(100000 + position);
            }
            rs.setImageBitmap(BitmapUtil.loadIdImage(
                    "friends_sends_pictures_no", mContext));
            final ImageItem item = (ImageItem) getItem(position);
            rs.loadImageFromPath(item.getImagePath());
            rs.setOnClickListener(new ImageViewItemClick(position));

            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    mControl.getRowHeight());
            rs.setLayoutParams(lp);

//          rs.setOnLongClickListener(new View.OnLongClickListener() {
//              
//              @Override
//              public boolean onLongClick(View v) {
//                  mControl.showImageView(item.getImagePath());
//                  return true;
//              }
//          });
            mCache.put(position, rs);
        }

        return rs;
    }

    @SuppressLint("NewApi")
    private View convertTest(int position, View convertView) {
        ImageViewItem rs = null;
        if (convertView == null) {
            rs = this.new ImageViewItem(mContext);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
                rs.setId(View.generateViewId());
            } else {
                rs.setId(100000 + position);
            }
        } else {
            rs = (ImageViewItem) convertView;
        }
        rs.setImageBitmap(BitmapUtil.loadIdImage("friends_sends_pictures_no",
                mContext));
        ImageItem item = (ImageItem) getItem(position);
        rs.loadImageFromPath(item.getImagePath());

        rs.setOnClickListener(new ImageViewItemClick(position));

        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, mControl.getRowHeight());
        rs.setLayoutParams(lp);

        return rs;
    }

    private class ImageViewLoader implements Runnable {

        private String path = "";
        private ImageViewItem item = null;
        private Bitmap bitmap = null;

        public ImageViewLoader(ImageViewItem rs, String p) {
            // rs.beginLoad();
            item = rs;
            path = p;
        }

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            BitmapFactory.Options options = new BitmapFactory.Options();
            // 设置为true,表示解析Bitmap对象,该对象不占内存
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, options);
            // 设置缩放比例
            options.inSampleSize = computeScale(options, 300, 200);

            // 设置为false,解析Bitmap对象加入到内存中
            options.inJustDecodeBounds = false;
            bitmap = BitmapFactory.decodeFile(path, options);

            Log.d(ImageSelectorAdapter.TAG,
                    "load image  - " + (System.currentTimeMillis() - start));
            Activity ctx = (Activity) ImageSelectorAdapter.this.mContext;
            // if (Thread.interrupted()) {
            // return;
            // }
            ctx.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    item.setImageBitmap(bitmap);
                    item.setTag(bitmap);
                }
            });

        }

    }

    /**
     * 根据View(主要是ImageView)的宽和高来计算Bitmap缩放比例。默认不缩放
     * 
     * @param options
     * @param width
     * @param height
     */
    private int computeScale(BitmapFactory.Options options, int viewWidth,
            int viewHeight) {
        int inSampleSize = 1;
        if (viewWidth == 0 || viewWidth == 0) {
            return inSampleSize;
        }
        int bitmapWidth = options.outWidth;
        int bitmapHeight = options.outHeight;

        // 假如Bitmap的宽度或高度大于我们设定图片的View的宽高,则计算缩放比例
        if (bitmapWidth > viewWidth || bitmapHeight > viewWidth) {
            int widthScale = Math
                    .round((float) bitmapWidth / (float) viewWidth);
            int heightScale = Math.round((float) bitmapHeight
                    / (float) viewWidth);

            // 为了保证图片不缩放变形,我们取宽高比例最小的那个
            inSampleSize = widthScale < heightScale ? widthScale : heightScale;
        }
        return inSampleSize;
    }

    private class ImageViewItemClick implements View.OnClickListener {

        private int mPosition = 0;

        public ImageViewItemClick(int position) {
            mPosition = position;
        }

        @Override
        public void onClick(View v) {
            ImageViewItem item = (ImageViewItem) v;
            item._switch();
            if (item.isSelected()) {
                ImageSelectorAdapter.this.selectedItems.add(mPosition);
                item.setAlpha(100);
            } else {
                if (ImageSelectorAdapter.this.selectedItems.contains(mPosition)) {
                    ImageSelectorAdapter.this.selectedItems.remove(mPosition);
                    item.setAlpha(255);
                }
            }
            Log.e("PATH", "路径:" + mImages.get(mPosition).imagePath);
        }

    }

    private class ImageViewItem extends ImageView {

        public ImageViewItem(Context context) {
            super(context);
            this.setScaleType(ScaleType.CENTER_CROP);
        }

        private Thread loader = null;

        private boolean mIsSelectedItem = false;

        public synchronized void loadImageFromPath(String path) {
            loader = new Thread(new ImageViewLoader(this, path));
            loader.start();
        }

        public boolean isSelectedItem() {
            return mIsSelectedItem;
        }

        public void setSelectedItem(boolean value) {
            this.mIsSelectedItem = value;
        }

        private void _switch() {
            this.setSelectedItem(!this.isSelectedItem());
            this.invalidate();
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                this.setScaleX(ImageSelectorAdapter.SCALE);
                this.setScaleY(ImageSelectorAdapter.SCALE);
                break;
            case MotionEvent.ACTION_UP:
                resetScale();
                break;
            case MotionEvent.ACTION_CANCEL:
                resetScale();
                break;
            default:
                break;
            }
            return super.onTouchEvent(event);
        }

        private void resetScale() {
            this.setScaleX(1f);
            this.setScaleY(1f);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int width = MeasureSpec.getSize(widthMeasureSpec);
            setMeasuredDimension(width, width);
        }

        // public void _switch(boolean value) {
        // setImageItemSelected(value);
        // Log.e(ImageSelectorAdapter.TAG, "  switch to(" + this.getId()
        // + ") - " + value);
        // this.invalidate();
        // }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Log.e(ImageSelectorAdapter.TAG, "   onDraw(" + this.getId()
                    + ") - " + this.isSelected());
            if (this.isSelectedItem()) {
                Rect rect = canvas.getClipBounds();
                canvas.drawRect(rect, select_paint);
                canvas.drawBitmap(select_icon, 60, 10, select_paint);

            }
        }
    }

}

尝试过很多结局办法了,还有一种情况会发生,就是内存不溢出状态也在,就是有时候有的图片点击事件不起作用,滑动,被点击的图片才会被标记上。

1个回答

描述不是很清楚,最好加张图。贴个错误

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!