Android的TextView利用HTML类处理图片显示、字体样式

参照:http://my.oschina.net/u/194233/blog/175177
参照:http://codego.net/199295/
1 Spanned android.text.Html.fromHtml(String source)
输入的参数为(html格式的文本)
2 Spanned android.text.Html.fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler)
Source: 需处理的html文本
imageGetter :对图片处理

tagHandler :对标签进行处理

项目结构图:

一.MainActivity.java

package com.texthtml;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
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 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.AsyncTask;
import android.os.Environment;
import android.text.Html.ImageGetter;
import android.widget.TextView;


public class CImageGetter implements ImageGetter {
       private Context context;
       private TextView tv;

       public CImageGetter(Context context, TextView tv) {
              this.context = context;
              this.tv = tv;
       }

       @Override
       public Drawable getDrawable(String source) {
              String imageName = Common.md5(source);
              String sdcardPath = Environment.getExternalStorageDirectory().toString();
              String[] ss = source.split("\\.");
              String ext = ss[ss.length - 1];
              String savePath = sdcardPath + "/" + context.getPackageName() + "/" + imageName + "." + ext;
              File file = new File(savePath);
              if (file.exists()) {
                     Drawable drawable = Drawable.createFromPath(savePath);
                     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                     return drawable;
              }
              Resources res = context.getResources();
              URLDrawable drawable = new URLDrawable(res.getDrawable(R.drawable.ic_launcher));
              new ImageAsync(drawable).execute(savePath, source);
              return drawable;    
       }

       private class ImageAsync extends AsyncTask<String, Integer, Drawable> {
              private URLDrawable drawable;
              public ImageAsync(URLDrawable drawable) {
                     this.drawable = drawable;
              }

              @Override
              protected Drawable doInBackground(String... params) {
                     String savePath = params[0];
                     String url = params[1];                 
                     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;
                     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();
                            fileout.close();  //关闭流
                            Drawable mDrawable = Drawable.createFromPath(savePath);
                            return mDrawable;
                     } catch (Exception e) {
                            // TODO: handle exception
                     }
                     return drawable;
              } 

              @Override
              protected void onPostExecute(Drawable result) {
                     // TODO Auto-generated method stub
                     super.onPostExecute(result);
                     if (result != null) {
                            drawable.setDrawable(result);
                            tv.setText(tv.getText()); // 更新UI
                     }
              }          
       }
}
       public class URLDrawable extends BitmapDrawable {
              private Drawable drawable;
              public URLDrawable(Drawable defaultDraw) {
                     setDrawable(defaultDraw);
              }            

              private void setDrawable(Drawable nDrawable) {
                     drawable = nDrawable;
                     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                     setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
              }

              @Override
              public void draw(Canvas canvas) {
                     drawable.draw(canvas);
              }            
       }

二.CImageGetter.java 继承ImageGetter

public class CImageGetter implements ImageGetter {
    private Context context;
    private TextView tv;
    public CImageGetter(Context context, TextView tv) {
        this.context = context;
        this.tv = tv;
    }

    @Override
    public Drawable getDrawable(String source) {
        String imageName = Common.md5(source);
        String sdcardPath = Environment.getExternalStorageDirectory().toString();
        String[] ss = source.split("\\.");
        String ext = ss[ss.length - 1];
        String savePath = sdcardPath + "/" + context.getPackageName() + "/" + imageName + "." + ext;
        File file = new File(savePath);
        if (file.exists()) {
            Drawable drawable = Drawable.createFromPath(savePath);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            return drawable;
        }
        Resources res = context.getResources();
        URLDrawable drawable = new URLDrawable(res.getDrawable(R.drawable.ic_launcher));
        new ImageAsync(drawable).execute(savePath, source);
        return drawable;
    }
}
private class ImageAsync extends AsyncTask<String, Integer, Drawable> {
    private URLDrawable drawable;

    public ImageAsync(URLDrawable drawable) {
        this.drawable = drawable;
    }

    @Override
    protected Drawable doInBackground(String... params) {
        String savePath = params[0];
        String url = params[1];
        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;
        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();
            fileout.close();  //关闭流
            Drawable mDrawable = Drawable.createFromPath(savePath);
            return mDrawable;
        } catch (Exception e) {
            // TODO: handle exception
        }
        return drawable;
    }

    @Override
    protected void onPostExecute(Drawable result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if (result != null) {
            drawable.setDrawable(result);
            tv.setText(tv.getText()); // 更新UI
        }
    }
}
public class URLDrawable extends BitmapDrawable {
    private Drawable drawable;
    public URLDrawable(Drawable defaultDraw) {
        setDrawable(defaultDraw);
    }

    private void setDrawable(Drawable nDrawable) {
        drawable = nDrawable;
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    }


    @Override
    public void draw(Canvas canvas) {
        drawable.draw(canvas);
    }
}

三.CTagHandler.java 继承TagHandler

public class CTagHandler implements TagHandler {
    private Context context;

    public CTagHandler(Context context) {
        this.context = context;
    }

    @Override
    public void handleTag(boolean opening, String tag, Editable output,
        XMLReader xmlReader) {
        if (tag.toLowerCase().equals("img")) {
        int len = output.length();
        ImageSpan[] images = output.getSpans(len-1, len, ImageSpan.class);
        String imgURL = images[0].getSource();
        output.setSpan(new ImageClick(context, imgURL), len-1, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }
}
private class ImageClick extends ClickableSpan {
    private String url;
    private Context context;

    public ImageClick(Context context, String url) {
        this.context = context;
        this.url = url;
    }

    @Override
    public void onClick(View widget) {
        String imageName = Common.md5(url);
        String sdcardPath = Environment.getExternalStorageDirectory().toString(); // 获取SDCARD的路径
        String[] ss = url.split("\\.");
        String ext = ss[ss.length - 1];
        String savePath = sdcardPath + "/" + context.getPackageName() + "/" + imageName + "." + ext;

        File file = new File(savePath);
        if (file.exists()) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(file), "image/*");
            context.startActivity(intent);
            Log.i("Load","data");
        }
    } 
}

一个公用类Common.java

public class Common {
    public static String md5(String sourceStr) {
    byte[] source = sourceStr.getBytes();

    String s = null;
    char hexDigits[] = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
    };

    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(source);
        byte tmp[] = md.digest();
        char[] str = new char[16 * 2];
        int k = 0;
        for (int i = 0; i < 16; i++) {
        byte byte0 = tmp[i];
        str[k++] = hexDigits[byte0 >>> 4 & 0xf];
        str[k++] = hexDigits[byte0 & 0xf];
    }
        s = new String(str);
    } catch (Exception e) {
        // TODO: handle exception
    }
    return s;
    }
}

转自洪生鹏博客网站,原文地址:http://hongshengpeng.com/article/show/199.aspx

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值