前言:程序猿真的是有个通病啊,电梯上就在研究电梯的逻辑代码,走路看到红绿灯也会去研究算法,今天心情不错,于是就发了一个说说,发现某q空间中显示了我发的说说,但是我发的笑脸跟哭脸表情由于网络慢,很久才加载出来,于是我惊讶了,原来表情发的时候存在本地,等发完显示确实网络上拿的,而且还支持gif,好吧,不得不说某q真是牛逼!!

网上textView显示网络图片的例子一大堆啊,但是都不靠谱,于是我弄出了一个靠谱点的思路。

简单介绍下思路吧:
主要就是利用text.setText(Html.fromHtml(“html”));把后台返回的html显示在textview中,后台返回的html可能是这样的:

 String html="dfdfdf<img src=\"http://j1.s2.dpfile.com/pc/5e356bd48d39f4f7f1e37261c29841f5%28700x700%29/thumb.jpg\"/>fdfdfd";

那么如果img中包含的是一个网络的图片链接,我们的源码中有处理吗??我们接下来看看Html.fromHtml源码:

 @Deprecatedpublic static Spanned fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler) {return fromHtml(source, FROM_HTML_MODE_LEGACY, imageGetter, tagHandler);}

接着往下看:

  public static Spanned fromHtml(String source, int flags, ImageGetter imageGetter,TagHandler tagHandler) {.......省略代码HtmlToSpannedConverter converter =new HtmlToSpannedConverter(source, imageGetter, tagHandler, parser, flags);return converter.convert();}

然后重点看一下HtmlToSpannedConverter类,在这个类中我们又看到了这么一个方法:

 private void handleStartTag(String tag, Attributes attributes) {if (tag.equalsIgnoreCase("br")) {// We don't need to handle this. TagSoup will ensure that there's a </br> for each <br>// so we can safely emit the linebreaks when we handle the close tag.} else if (tag.equalsIgnoreCase("p")) {startBlockElement(mSpannableStringBuilder, attributes, getMarginParagraph());startCssStyle(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("ul")) {startBlockElement(mSpannableStringBuilder, attributes, getMarginList());} else if (tag.equalsIgnoreCase("li")) {startLi(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("div")) {startBlockElement(mSpannableStringBuilder, attributes, getMarginDiv());} else if (tag.equalsIgnoreCase("span")) {startCssStyle(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("strong")) {start(mSpannableStringBuilder, new Bold());} else if (tag.equalsIgnoreCase("b")) {start(mSpannableStringBuilder, new Bold());} else if (tag.equalsIgnoreCase("em")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("cite")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("dfn")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("i")) {start(mSpannableStringBuilder, new Italic());} else if (tag.equalsIgnoreCase("big")) {start(mSpannableStringBuilder, new Big());} else if (tag.equalsIgnoreCase("small")) {start(mSpannableStringBuilder, new Small());} else if (tag.equalsIgnoreCase("font")) {startFont(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("blockquote")) {startBlockquote(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("tt")) {start(mSpannableStringBuilder, new Monospace());} else if (tag.equalsIgnoreCase("a")) {startA(mSpannableStringBuilder, attributes);} else if (tag.equalsIgnoreCase("u")) {start(mSpannableStringBuilder, new Underline());} else if (tag.equalsIgnoreCase("del")) {start(mSpannableStringBuilder, new Strikethrough());} else if (tag.equalsIgnoreCase("s")) {start(mSpannableStringBuilder, new Strikethrough());} else if (tag.equalsIgnoreCase("strike")) {start(mSpannableStringBuilder, new Strikethrough());} else if (tag.equalsIgnoreCase("sup")) {start(mSpannableStringBuilder, new Super());} else if (tag.equalsIgnoreCase("sub")) {start(mSpannableStringBuilder, new Sub());} else if (tag.length() == 2 &&Character.toLowerCase(tag.charAt(0)) == 'h' &&tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {startHeading(mSpannableStringBuilder, attributes, tag.charAt(1) - '1');} else if (tag.equalsIgnoreCase("img")) {startImg(mSpannableStringBuilder, attributes, mImageGetter);} else if (mTagHandler != null) {mTagHandler.handleTag(true, tag, mSpannableStringBuilder, mReader);}}

重点看一下这个判断:

else if (tag.equalsIgnoreCase("img")) {startImg(mSpannableStringBuilder, attributes, mImageGetter);} 

我们看看startImg方法:

  private static void startImg(Editable text, Attributes attributes, Html.ImageGetter img) {String src = attributes.getValue("", "src");Drawable d = null;if (img != null) {d = img.getDrawable(src);}if (d == null) {d = Resources.getSystem().getDrawable(com.android.internal.R.drawable.unknown_image);d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());}int len = text.length();text.append("\uFFFC");text.setSpan(new ImageSpan(d, src), len, text.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);}

看到这里了如果做过TextView的富文本的童鞋有没有一点熟悉了呢?直接创建了一个ImageSpan,然后传入了一个Drawable,那么这个Drawable是哪里来的呢?
是通过 Html.ImageGetter的getDrawable方法获取的!! 那么这个mImageGetter对象有没有初始化呢? 我们在代码中找找:

是在fromHtml方法中传进去的,也就是说,如果我们不传ImageGetter对象的话,当获取到img标签时,如果ImageGetter为null,那么会走下面判断:

  if (img != null) {d = img.getDrawable(src);}if (d == null) {d = Resources.getSystem().getDrawable(com.android.internal.R.drawable.unknown_image);d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());}

而unknown_image就是android系统默认给的一张占位图。

有了前面的了解了,然后我们就开动了,首先得创建一个ImageGetter对象在Html.fromHtml中传给TextView.然后当判断html中有img标签的时候,我们就去网络加载图片,加载完毕后再次赋给TextView.

由于代码简单,我就直接上代码了:

 public TextView text;private static class MyHandler extends Handler {private WeakReference<PropertyAnimActivity4_evaluator>activityWeakReference;public MyHandler(PropertyAnimActivity4_evaluator activity){activityWeakReference=new WeakReference<PropertyAnimActivity4_evaluator>(activity);}@Overridepublic void handleMessage(Message msg) {final Drawable drawable= (Drawable) msg.obj;PropertyAnimActivity4_evaluator activity=activityWeakReference.get();if(activity!=null){String html="dfdfdf<img src=\"http://j1.s2.dpfile.com/pc/5e356bd48d39f4f7f1e37261c29841f5%28700x700%29/thumb.jpg\"/>fdfdfd";Spanned spanned = Html.fromHtml(html, new Html.ImageGetter() {@Overridepublic Drawable getDrawable(String source) {return drawable;}}, null);activity.text.setText(spanned);}}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_property_anim_activity4_evaluator);bt_anim_view= (Button) findViewById(R.id.bt_anim_view);text= (TextView) findViewById(R.id.text);String html="dfdfdf<img src=\"http://j1.s2.dpfile.com/pc/5e356bd48d39f4f7f1e37261c29841f5%28700x700%29/thumb.jpg\"/>fdfdfd";Spanned spanned = Html.fromHtml(html, new Html.ImageGetter() {@Overridepublic Drawable getDrawable(String source) {AsyncTask<String, Float, Drawable> task = new AsyncTask<String, Float, Drawable>() {@Overrideprotected Drawable doInBackground(String... params) {try {URL url=new URL(params[0]);URLConnection con = url.openConnection();con.setConnectTimeout(50000);Drawable d = Drawable.createFromStream(con.getInputStream(), "");d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());return d;} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Drawable drawable) {Message msg=Message.obtain();msg.obj=drawable;new MyHandler(PropertyAnimActivity4_evaluator.this).sendMessage(msg);}}.execute(source);BitmapDrawable bitmapDrawable = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));bitmapDrawable.setBounds(0,0,bitmapDrawable.getIntrinsicWidth(),bitmapDrawable.getIntrinsicHeight());return bitmapDrawable;}}, null);text.setText(spanned);}

如果是像某Q一样,放在ListView中,并且显示的是gif图片,又咋搞呢????? 小伙伴们如果有好的思路,或者做过类型的,一起探讨一下哈!!!拜谢啦~~~~

Android TextView显示网络图片相关推荐

  1. Android TextView 显示HTML加图片

    TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运 ...

  2. android textview 显示一行,且超出自动截断,显示...

    1)设置文本是否包含顶部和底部的额外空白 在xml文件的TextView控件中加入如下属性: android:includeFontPadding="false" 2)有时直接引用 ...

  3. android ListView显示网络图片

    研究了android两个礼拜,稍微有了点眉目,开始正式帮公司开发应用的时候,发现ListView没有现成的显示网络图片的类或方法,网上查了查也没找到好的解决方法.心一横,自己研究吧,现在把我的解决办法 ...

  4. android textview显示表情,在Android TextView中显示表情符号/情感图标

    我在Android TextView中显示表情符号图标时遇到一些问题 首先,我在这里找到了Unicode表情符号图标列表:http : //www.easyapns.com/category/just ...

  5. Android中显示网络图片

    本文参照自:  http://developer.51cto.com/art/201001/180968.htm 在Android中,显示网络图片还是比较简单的.当我们开始启动一个任务加载一个View ...

  6. 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)

    1.TextView的属性maxLength和maxEms 1). maxLength 作用:设置TextView 文本显示的个数 理解:把text的字符取出来,截取了指定个数个字符,然后将截取的字符 ...

  7. android TextView显示文字和图片

    为什么80%的码农都做不了架构师?>>>    在做web的时候jsp页面可以直接显示一段html代码,如: <html><head><title> ...

  8. android 显示图片和文字,android TextView显示文字和图片

    在做web的时候jsp页面可以直接显示一段html代码,如: TextView使用HTML 强调 斜体 " +" 超链接HTML入门学习HTML! 颜色1" +" ...

  9. android textview 显示表情和文字 表情带超链接

    public int getResourceId(String name){try {//根据资源的id的变量名获得field对象.使用反射来实现的Field field = R.drawable.c ...

最新文章

  1. DHCP自动分配地址;DHCP指定IP给客户端
  2. Java异常处理及异常机制介绍
  3. 围棋棋盘上的波粒二象性
  4. linux双机(多机)自动互备份方案
  5. Drools 6.2.0.Final发布
  6. 一文读懂机器学习的常用模型评价指标
  7. 【华为云技术分享】STM32L476移植华为LiteOS系列教程---开发前的准备 2
  8. Python数据结构————二叉查找树的实现
  9. 了解Base64编码的原理(js核对)
  10. 用VC++ 6.0实现视频捕捉
  11. phpstudy 上怎么运行 thinkPHP ?
  12. Socket.io 的 emit
  13. springboot官方文档PDF下载指北
  14. java.net.UnknownServiceException: CLEARTEXT communication to xxxxx not permitted by network secur...
  15. 【word】删除页眉横线
  16. 深度长文探讨Join运算的简化和提速
  17. 河南计算机会考必背知识点,2017年河南物理高中会考知识点大全
  18. 这篇文章告诉你时光穿梭机特效从年轻变老制作软件
  19. 计算机导航种植牙的优势,计算机导航微创种植牙修复
  20. 网站敏感骂人词库及算法(附6仟个敏感词)

热门文章

  1. 【Android】Retrofit基础源码分析
  2. iOS 【消息处理 performSelector】
  3. 计算机开机控制信号,笔记本电脑开机及信号电路故障维修
  4. 工厂模式实现及使用场景--java
  5. echarts叠加3D立体柱状图
  6. Batch Normalization(BN)简介
  7. HTML5页面,用JS 禁止弹出手机键盘
  8. 小红书最新入驻,小红书入驻细节,小红书商家入驻
  9. JavaWeb通过http下载多个文件,打包下载,压缩下载
  10. twine创建软链接_如何使用Twine和SugarCube创建交互式冒险游戏