textview显示表情图片

调用的部分:

holder.message.setText(Html.fromHtml(str));

		Spanned spanned = Html.fromHtml(str, new MyImageGetter(context,
				holder.message, dm), null);
		holder.message.setText(spanned);


holder.message为textview,str为显示的String和图片

MyImageGetter.java

package com.etwod.gsyzd.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import com.etwod.gsyzd.R;
import com.etwod.gsyzd.util.UserTask.TaskCallback;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.text.Html.ImageGetter;
import android.util.DisplayMetrics;
import android.widget.TextView;

public class MyImageGetter implements ImageGetter {

	private Context context;
	private TextView tv;
	private DisplayMetrics mDm;

	private DrawableLoader drawableLoader = null;
	private URI uri;

	public MyImageGetter(Context context, TextView tv, DisplayMetrics dm) {
		this.context = context;
		this.tv = tv;
		this.mDm = dm;
		drawableLoader = DrawableLoader.getInstance();
	}

	@Override
	public Drawable getDrawable(String source) {
		// TODO Auto-generated method stub
		try {
			uri = new URI(source);
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (!source.equals("") && !source.equals(null) && uri.isAbsolute()) {

			// 将source进行MD5加密并保存至本地
			final String imageName = Common.md5(source);
			final String sdcardPath = Environment.getExternalStorageDirectory()
					.toString(); // 获取SDCARD的路径

			// 最终图片保持的地址
			String savePath = sdcardPath + "/DownLoad/cache_images/"
					+ imageName;

			// 加载默认图
			Resources res = context.getResources();
			URLDrawable drawable = new URLDrawable(
					res.getDrawable(R.drawable.empty_photo));
			File file = new File(savePath);

			if (file.exists()
					&& drawableLoader.getBitmapFromMemoryCache(savePath) != null) {
				drawable = (URLDrawable) drawableLoader
						.getBitmapFromMemoryCache(savePath);
				return drawable;
			} else if (file.exists()
					&& drawableLoader.getBitmapFromMemoryCache(savePath) == null) {
				// new sdImageAsync(drawable).execute(savePath);
				sdAsyncTask sdTask = new sdAsyncTask(context, drawable);
				sdTask.registerCallback(new TaskCallback<String, Integer, Drawable>() {

					@Override
					public Drawable call(
							UserTask<String, Integer, Drawable> task,
							String[] params) throws Exception {
						// TODO Auto-generated method stub
						String savePath = params[0];
						Drawable drawable = null;
						drawable = Drawable.createFromPath(savePath);
						
						URLDrawable uDrawable = new URLDrawable(drawable);
						drawableLoader.addBitmapToMemoryCache(savePath,
								uDrawable);
						return drawable;
					}
				});
				sdTask.execute(savePath);

			} else {
				// new webImageAsync(drawable).execute(savePath, source);
				webAsyncTask webtask = new webAsyncTask(context, drawable);
				webtask.registerCallback(new TaskCallback<String, Integer, Drawable>() {

					@Override
					public Drawable call(
							UserTask<String, Integer, Drawable> task,
							String[] params) throws Exception {
						// TODO Auto-generated method stub
						String savePath = params[0];
						String url = params[1];

						Drawable drawable = null;
						InputStream in = null;
						try {
							// 获取网络图片
							HttpGet http = new HttpGet(url);
							HttpClient client = new DefaultHttpClient();
							HttpResponse response = client
									.execute(http);
							BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(
									response.getEntity());
							in = bufferedHttpEntity.getContent();
							
						} catch (Exception e) {
							try {
								if (in != null)
									in.close();
							} catch (Exception e2) {
								// TODO: handle exception
							}
						}
						// 获取的数据流为空时返回默认图片
						if (in == null)
							return drawable;
						// 将图片保存到SDcard
						try {
							File file = new File(savePath);
							String basePath = file.getParent();
							File basePathFile = new File(basePath);
							if (!basePathFile.exists()) {
								basePathFile.mkdirs();
							}
							// 创建文件
							file.createNewFile();
							FileOutputStream fileout = new FileOutputStream(
									file);
							byte[] buffer = new byte[4 * 1024];
							// 写入数据
							while (in.read(buffer) != -1) {
								fileout.write(buffer);
							}
							fileout.flush();
							File file2 = new File(savePath);
//							Log.e("图片大小", imageName+"----"+file2.length()+"");
							if(file2.length()>4096){
								String oo = ImageUtil.saveImg(
										ImageUtil
												.getThumbUploadPath(
														savePath,
														(int) (mDm.widthPixels - mDm.scaledDensity * 30)),
										imageName, "/DownLoad/cache_images/");
							}
							
							Drawable mDrawable = Drawable
									.createFromPath(savePath);
							URLDrawable uDrawable = new URLDrawable(mDrawable);
							drawableLoader.addBitmapToMemoryCache(savePath,
									uDrawable);
							return mDrawable;
						} catch (Exception e) {
							// TODO: handle exception
						}
						return drawable;
					}
				});
				webtask.execute(savePath, source);
			}
			return drawable;
		} else {

			return null;
		}
	}

	// 读取缓存图片
	private class sdAsyncTask extends UserTask<String, Integer, Drawable> {
		private URLDrawable drawable;

		public sdAsyncTask(Context context, URLDrawable uDrawable) {
			super(context);
			this.drawable = uDrawable;
		}

		@Override
		protected void onErrorHandle(Context context, Exception error) {
			// TODO Auto-generated method stub

		}

		@Override
		protected void onTaskFinished(Context context, Drawable result) {
			// TODO Auto-generated method stub
			if (result != null) {
				drawable.setDrawable(result);
				tv.setText(tv.getText()); // 通过这里的重新设置 TextView 的文字来更新UI
				// System.out.println("tv.getText() ==> " + tv.getText() );
			}
		}

	}

	// 读取网络图片并缓存
	private class webAsyncTask extends UserTask<String, Integer, Drawable> {
		private URLDrawable drawable;

		public webAsyncTask(Context context, URLDrawable uDrawable) {
			super(context);
			this.drawable = uDrawable;
		}

		@Override
		protected void onErrorHandle(Context context, Exception error) {
			// TODO Auto-generated method stub

		}

		@Override
		protected void onTaskFinished(Context context, Drawable result) {
			// TODO Auto-generated method stub
			if (result != null) {
				drawable.setDrawable(result);
				tv.setText(tv.getText()); // 通过这里的重新设置 TextView 的文字来更新UI
				// System.out.println("tv.getText() ==> " + tv.getText() );
			}
		}

	}

	public class URLDrawable extends BitmapDrawable {

		private Drawable drawable;

		public URLDrawable(Drawable defaultDraw) {
			setDrawable(defaultDraw);
		}

		private void setDrawable(Drawable nDrawable) {
			drawable = nDrawable;
			// textview显示区域的宽
			int tvW = (int) (mDm.widthPixels - mDm.scaledDensity * 30);
			// mDm == > DisplayMetrics{density=1.5, width=540, height=960,
			// scaledDensity=1.5, xdpi=274.32, ydpi=273.97754}
			if (drawable.getIntrinsicWidth() * mDm.scaledDensity < tvW) {
				drawable.setBounds(
						0,
						0,
						(int) (drawable.getIntrinsicWidth() * mDm.scaledDensity),
						(int) (drawable.getIntrinsicHeight() * mDm.scaledDensity));
				setBounds(
						0,
						0,
						(int) (drawable.getIntrinsicWidth() * mDm.scaledDensity),
						(int) (drawable.getIntrinsicHeight() * mDm.scaledDensity));
			} else {
				drawable.setBounds(0, 0, tvW-20,
						drawable.getIntrinsicHeight() * (tvW-20) / drawable
								.getIntrinsicWidth());
				setBounds(0, 0, tvW,
						drawable.getIntrinsicHeight() * (tvW-20) / drawable
								.getIntrinsicWidth());
			}
		}

		@Override
		public void draw(Canvas canvas) {
			// TODO Auto-generated method stub
			drawable.draw(canvas);
		}

	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值