调用的部分:
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); } } }