问题描述
- 很棘手的问题,关于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); } } } }
尝试过很多结局办法了,还有一种情况会发生,就是内存不溢出状态也在,就是有时候有的图片点击事件不起作用,滑动,被点击的图片才会被标记上。
解决方案
描述不是很清楚,最好加张图。贴个错误
时间: 2024-11-02 15:21:45