读取本地图片多选问题-很棘手的问题,关于gridview加载图片

问题描述

很棘手的问题,关于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-08-11 12:40:54

读取本地图片多选问题-很棘手的问题,关于gridview加载图片的相关文章

安卓应用开发-gridview加载图片会乱而且重复

问题描述 gridview加载图片会乱而且重复 我用gridview加载tomcat服务器上的图片,但是显示出来后会乱而且重复,滑动后图片又变成其他的了,我查了下是position的问题,但是实在不知道该怎么去修改 解决方案 贴代码看看 看下你的 adapter 和 点击事件 解决方案二: public class HeroAdapter extends CommonBaseAdapter { String url = "http://192.168.1.108:8080/heroServer/

Android编程学习之异步加载图片的方法_Android

本文实例讲述了Android编程学习之异步加载图片的方法.分享给大家供大家参考,具体如下: 最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存溢出问题,一般情况下,加载一张大图就会导致内存溢出,同样,加载多张图片内存溢出的概率也很高. 列一下网络上查到的一般做法: 1.使用BitmapFactory.Options对图片进行压缩 2.优化加载图片的

jquery lazyload实现下拉滚动条时加载图片

lazyload图片延迟加载使图片在下拉滚动条时加载,一个很不错的用户体验,既减少了页面加载的时间了,也减轻了服务器的压力. 使用方法: 使用JQuery插件 ,插件名: jquery.lazyload(7kb大小),压缩后(3kb大小). 1.直接导入Jquery插件 <script src="jquery.js" type="text/javascript"></script> <script src="jquery.la

WPF循环加载图片导致内存溢出如何解决

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1.var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆.2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStrea

[Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画. github地址:https://github.com/wangjiegulu/ImageLoaderSample 解决了: 1. listview加载oom问题 2. listview加载时卡顿的现象 3. listview

ios7-ios开发 UITableView异步加载图片,滑动时会很卡

问题描述 ios开发 UITableView异步加载图片,滑动时会很卡 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *cellIdentifier = @"cellIdentifier"; BrandTableViewCell *cell = (BrandTableViewCell *)[tab

利用LruCache为GridView加载大量本地图片完整示例

MainActivity如下: package cc.testlrucache; import android.os.Bundle; import android.widget.GridView; import android.app.Activity; /** * Demo描述: * Android利用LruCache为GridView加载大量本地图片完整示例,防止OOM * * 更多参考: * http://blog.csdn.net/lfdfhl */ public class MainA

android异步加载图片并缓存到本地实现方法

在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public

android中Glide实现加载图片保存至本地并加载回调监听

Glide 加载图片使用到的两个记录 Glide 加载图片保存至本地指定路径 /** * Glide 加载图片保存到本地 * * imgUrl 图片地址 * imgName 图片名称 */ Glide.with(context).load(imgUrl).asBitmap().toBytes().into(new SimpleTarget<byte[]>() { @Override public void onResourceReady(byte[] bytes, GlideAnimation