`

<android里图片下载工具类AsyncImageLoader分析> 后续:优化

 
阅读更多
package com.su.testimageview;

import com.su.testimageview.AsyncImageLoader.ImageCallback;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;

public class TestImageViewActivity extends Activity {
	public static Context context;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		context = this;
		ImageView imageView = (ImageView) findViewById(R.id.imageView1);
		AsyncImageLoader asyncImageLoader = new AsyncImageLoader();

		Drawable asyndrawable = asyncImageLoader.loadDrawable(
				// 直接从url获取drawable
				"http://avatar.csdn.net/7/C/8/1_sfshine.jpg", imageView,
				new ImageCallback() {//callback方法不用变
					public void imageLoaded(Drawable imageDrawable,
							ImageView imageView, String imageUrl) {
						imageView.setImageDrawable(imageDrawable);

					}
				});
		imageView.setImageDrawable(asyndrawable);// 设置成获取的drawable.
	}
}



package com.su.testimageview;

import java.lang.ref.SoftReference;
import java.util.HashMap;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

public class AsyncImageLoader {

	// SoftReference是软引用,是为了更好的为了系统回收变量
	private HashMap<String, SoftReference<Drawable>> imageCache;

	public AsyncImageLoader() {
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}

	/**
	 * 
	 * @param imageUrl
	 *            图片网址
	 * @param imageView
	 *            所要显示图片的imageview
	 * @param imageCallback
	 *            实现一个callback 比较固定
	 * @return
	 */

	public Drawable loadDrawable(final String imageUrl,
			final ImageView imageView, final ImageCallback imageCallback) {

		if (imageCache.containsKey(imageUrl)) {
			// 从缓存中获取
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			Drawable drawable = softReference.get();
			if (drawable != null) {
				return drawable;
			}
		}

		final Handler handler = new Handler() {
			public void handleMessage(Message msg) {
				imageCallback.imageLoaded((Drawable) msg.obj, imageView,
						imageUrl);
			}
		};

		// 建立新一个新的线程下载图片
		new Thread() {
			public void run() {
				Drawable drawable = null;

				try {
					// 指定大小的图片不进行圆角处理
					if (imageUrl.endsWith("/160") || imageUrl.endsWith("/460")) {
						drawable = ImageUtil.getDrawableFromUrl(imageUrl);
					} else {
						drawable = ImageUtil
								.geRoundDrawableFromUrl(imageUrl, 7);
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block

					// 为空时处理默认图片
					Bitmap bm = BitmapFactory.decodeResource(
							TestImageViewActivity.context.getResources(),
							R.drawable.ic_launcher);
					drawable = ImageUtil.byteToDrawable(ImageUtil
							.Bitmap2Bytes(ImageUtil.toRoundCorner(bm, 7)));
					e.printStackTrace();
				}

				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message msg = handler.obtainMessage(0, drawable);
				handler.sendMessage(msg);
			}
		}.start();
		return null;
	}

	// 回调接口
	public interface ImageCallback {
		public void imageLoaded(Drawable imageDrawable, ImageView imageView,
				String imageUrl);
	}

}

package com.su.testimageview;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

/**
 * 图片圆角处理
 */
public class ImageUtil {

	public static InputStream getRequest(String path) throws Exception {

		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		conn.setConnectTimeout(5000);

		if (conn.getResponseCode() == 200) {
			return conn.getInputStream();
		}

		return null;
	}

	public static byte[] readInputStream(InputStream inStream) throws Exception {

		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[4096];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		outStream.close();
		inStream.close();

		return outStream.toByteArray();
	}

	public static Drawable loadImageFromUrl(String url) {
		// TODO Auto-generated method stub

		URL u;
		InputStream i = null;

		try {
			u = new URL(url);
			i = (InputStream) u.getContent();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Drawable d = Drawable.createFromStream(i, "src");
		return d;
	}

	public static Drawable getDrawableFromUrl(String url) throws Exception {
		return Drawable.createFromStream(getRequest(url), null);
	}

	public static Bitmap getBitmapFromUrl(String url) throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		return byteToBitmap(bytes);
	}

	public static Bitmap getRoundBitmapFromUrl(String url, int pixels)
			throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		Bitmap bitmap = byteToBitmap(bytes);
		return toRoundCorner(bitmap, pixels);
	}

	public static Drawable geRoundDrawableFromUrl(String url, int pixels)
			throws Exception {
		byte[] bytes = getBytesFromUrl(url);
		BitmapDrawable bitmapDrawable = (BitmapDrawable) byteToDrawable(bytes);
		return toRoundCorner(bitmapDrawable, pixels);
	}

	public static byte[] getBytesFromUrl(String url) throws Exception {
		return readInputStream(getRequest(url));
	}

	public static Bitmap byteToBitmap(byte[] byteArray) {
		if (byteArray.length != 0) {
			return BitmapFactory
					.decodeByteArray(byteArray, 0, byteArray.length);
		} else {
			return null;
		}
	}

	public static Drawable byteToDrawable(byte[] byteArray) {
		ByteArrayInputStream ins = new ByteArrayInputStream(byteArray);
		return Drawable.createFromStream(ins, null);
	}

	public static byte[] Bitmap2Bytes(Bitmap bm) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
		return baos.toByteArray();
	}

	public static Bitmap drawableToBitmap(Drawable drawable) {

		Bitmap bitmap = Bitmap
				.createBitmap(
						drawable.getIntrinsicWidth(),
						drawable.getIntrinsicHeight(),
						drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
								: Bitmap.Config.RGB_565);
		Canvas canvas = new Canvas(bitmap);
		drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
				drawable.getIntrinsicHeight());
		drawable.draw(canvas);
		return bitmap;
	}

	/**
	 * 图片去色,返回灰度图片
	 * 
	 * @param bmpOriginal
	 *            传入的图片
	 * @return 去色后的图片
	 */
	public static Bitmap toGrayscale(Bitmap bmpOriginal) {
		int width, height;
		height = bmpOriginal.getHeight();
		width = bmpOriginal.getWidth();

		Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
				Bitmap.Config.RGB_565);
		Canvas c = new Canvas(bmpGrayscale);
		Paint paint = new Paint();
		ColorMatrix cm = new ColorMatrix();
		cm.setSaturation(0);
		ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
		paint.setColorFilter(f);
		c.drawBitmap(bmpOriginal, 0, 0, paint);
		return bmpGrayscale;
	}

	/**
	 * 去色同时加圆角
	 * 
	 * @param bmpOriginal
	 *            原图
	 * @param pixels
	 *            圆角弧度
	 * @return 修改后的图片
	 */
	public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) {
		return toRoundCorner(toGrayscale(bmpOriginal), pixels);
	}

	/**
	 * 把图片变成圆角
	 * 
	 * @param bitmap
	 *            需要修改的图片
	 * @param pixels
	 *            圆角的弧度
	 * @return 圆角图片
	 */
	public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {

		Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
				bitmap.getHeight(), Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		final int color = 0xff424242;
		final Paint paint = new Paint();
		final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
		final RectF rectF = new RectF(rect);
		final float roundPx = pixels;

		paint.setAntiAlias(true);
		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(color);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(bitmap, rect, rect, paint);

		return output;
	}

	/**
	 * 使圆角功能支持BitampDrawable
	 * 
	 * @param bitmapDrawable
	 * @param pixels
	 * @return
	 */
	public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable,
			int pixels) {
		Bitmap bitmap = bitmapDrawable.getBitmap();
		bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));
		return bitmapDrawable;
	}

}

http://dl.vmall.com/c0bcaq4bed

分享到:
评论

相关推荐

    AsyncImageLoader

    这段时间看见很多人做listview(比如模拟新浪客户端)用到这一个图片下载的类,我也不知道这个类到底是哪个大神写的,反正我使用这个类的时候接手别人的,刚开始,感觉这个类写的听不错,比我写的AsyncImageTask.java...

    网络获取图片工具

    网络获取图片工具类AsyncImageLoader

    Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。 public ...

    android异步显示网络图片

    网上的很多代码只有AsyncImageLoader,没有PicUtils 我加上了PicUtils

    ViewFlipper+AsyncImageLoader实现页面滑动及页面图片异步加载

    页面滑动指引,图片异步加载,简单的javabean使用

    AsyncImageLoader.zip_android开发_Java_

    实现android图片异步加载,提高用户体验,通过Handler和消息队列对ImageView进行异步更新

    AsyncListImage.zip

    android 学习demo AsyncListImage,适合学习用: AsyncImageLoader.java AsyncListImage.java fileNameList.txt ImageAndText.java ImageAndTextListAdapter.java ViewCache.java

    async-image-loader

    异步图片加载器(Android) 该库可用于异步图像加载,显示和缓存(内存和磁盘)。 它还提供自定义选项,并且有据可查。特征异步多线程图像加载使用AsyncImageLoaderConfig各种自定义选项(线程池大小,占位符图像,...

    ListView Adapter优化 实例

    代码如下://方案一 – adapter优化public class listviewAdapterDemo1 extends BaseAdapter {  private String[] mArrData; private ListView listView; private AsyncImageLoader asyncImageLoader; private ...

Global site tag (gtag.js) - Google Analytics