Android的TextView利用HTML类处理图片显示、字体样式
2015-11-24 16:58
736 查看
参照: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
二.CImageGetter.java 继承ImageGetter
三.CTagHandler.java 继承TagHandler
一个公用类Common.java
转自洪生鹏博客网站,原文地址:http://hongshengpeng.com/article/show/199.aspx
参照: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
[code]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 } } } }
[code] 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
[code]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; } }
[code]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 } } }
[code]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
[code]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); } } }
[code]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
[code]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
相关文章推荐
- 基于RecyclerView-添加上啦加载(AndroidStudio)
- Android开发之获取当前设备的密度值(dp)
- Android开发 模块化编程之引用本地的aar
- android listView功能简介
- 给Activity添加自己需要的方法
- Android控件之AutoCompleteTextView
- Android apk反编译
- 关于AndroidAnnotations取消后台任务的方法
- Android 自动弹出输入框
- GitLab/Git在AndroidStudio上的配置和简单使用
- android谷歌官方自带SwipeRefreshLayout实现下拉刷新
- Android MVP模式
- Android uncovers master-key 漏洞分析
- android开发之线程基础
- Android讯飞语音云语音听写学习
- Android Manifest.xml文件概述
- Android中AIDL
- android volley
- Android Volley:使用方法总结及实例解析
- android编译分析之4—product.mk