Android开发技巧——TextView加载HTML的图片及代码显示问题
前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的问题都一一解决了。
下面说一下遇见的几个问题及我的解决方法。
TextView异步加载HTML中的图片及图文重叠
在TextView中加载HTML图片,需要实现Html.ImageGetter接口,然后在public Drawable getDrawable(String source)中去获取图片。图片获取我是直接使用了ImageLoader,一来加载图片省事,二来带缓存功能,正是我想要的。但是getDrawable方法是在主线程中调用的,且要求返回Drawable对象用于显示,而我们是不能在主线程中进行网络访问的,所以需要异步加载。ImageLoader本身已经有异步加载的功能,所以我们需要将它与getDrawable方法结合起来。这里用的方法与百度上常见到的方法略有不同,因为百度上的方法在我这里会有BUG,在第二次进入时图片经常加载不出来。
首先,写一个类继承BitmapDrawable,代码如下:
package com.githang.gradledoc.chapter;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
/**
* User: Geek_Soledad(msdx.android@qq.com)
* Date: 2014-11-30
* Time: 00:09
* FIXME
*/
public class URLDrawable extends BitmapDrawable {
protected Bitmap bitmap;
@Override
public void draw(Canvas canvas) {
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, getPaint());
}
}
}
这个类用于在getDrawable中返回的对象。
然后写一个类实现Html.ImageGetter接口,代码如下:
public class URLImageParser implements Html.ImageGetter {
TextView mTextView;
public URLImageParser(TextView textView) {
this.mTextView = textView;
}
@Override
public Drawable getDrawable(String source) {
final URLDrawable urlDrawable = new URLDrawable();
Log.d("ChapterActivity", Consts.BASE_URL + source);
ImageLoader.getInstance().loadImage(Consts.BASE_URL + source, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
urlDrawable.bitmap = loadedImage;
urlDrawable.setBounds(0, 0, loadedImage.getWidth(), loadedImage.getHeight());
mTextView.invalidate();
mTextView.setText(mTextView.getText()); // 解决图文重叠
}
});
return urlDrawable;
}
}
这里的mTextView是我们要加载图片的TextView对象。这里我暂未对图片做自适应屏幕的适配,做的比较简单,只是把加载后的图片设置到之前返回的URLDrawable对象中的urlDrawable去,然后调用mTextView.invalidate()方法更新界面。
但是这样写完之后,还有一个问题。尽管我们对urlDrawable调用了setBounds设置它的边框,但是还是会出现图片重叠的问题。需要重新设置一下mTextView的内容,如上面代码中的:
mTextView.setText(mTextView.getText());
设置HTML到TextView的代码如下:
mDocView.setText(Html.fromHtml(doc, new URLImageParser(mDocView), null));
显示的代码格式全乱
/**
* 处理代码显示问题.
*
* @param chapter 章节内容的html元素。
*/
private void handlerPreTag(Element chapter) {
Elements preElems = chapter.select("pre");
for (Element elem : preElems) {
elem.html(elem.html().replaceAll("\n", "<br/>").replaceAll(" ", " "));
}
}
最后上两张解决这个问题后的效果图:
Android开发技巧——TextView加载HTML的图片及代码显示问题的更多相关文章
- Android开发之高效加载Bitmap
一.概述 在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory).这篇文章我们会介绍如何高效地在Android开发中使用Bi ...
- Android开发问题积累 <加载在线Gif><WebView无法加载网页图片>
在线Gif加载 解决办法 Glide完美解决 Glide.with(context).load(pic).placeholder(R.drawable.loading).into(imageView) ...
- Android 开发 上拉加载更多功能实现
实现思维 开始之前先废话几句,Android系统没有提供上拉加载的控件,只提供了下拉刷新的SwipeRefreshLayout控件.这个控件我们就不废话,无法实现上拉刷新的功能.现在我们说说上拉加载更 ...
- android开发--使用webView加载tel协议不会打开拨号盘解决
在加载url之前进行判断,url是否是tel协议开头,然后进行加载,即可打开拨号盘 mWebView.setWebViewClient(new WebViewClient() { @Override ...
- Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类
ViewPager是Android的support库中的一个控件. ViewPager + Fragment的使用,已经有FragmentAdapter的实现可以帮助我们快速进行开发了: ViewPa ...
- Android开发中如何加载API源码帮助开发
在eclipse中添加android源码既可以帮助我们的开发,又能使我们边开发边学习. android环境的搭建:http://blog.csdn.net/dawanganban/article/de ...
- Android开发技巧一--weight属性实现视图的居中(半)显示
面试时,一位面试官问到:“如果我想讲按钮居中显示,并且占据其父视图宽度的一半,应该怎么做到呢?”即实现这种效果: 我们使用weightSum属性和layout_weight属性实现这一要求: < ...
- Android中的Glide加载图片
注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
随机推荐
- PHP 字符串变量
PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...
- ubuntu ssh 防止登陆断开
client 端: echo -e '\nServerAliveInterval 30' >> ~/.ssh/ssh_config server 端: echo -e '\nClientA ...
- JVM三种垃圾收集算法思想及发展过程
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sw ...
- Spring MVC 实践 - Component
Spring MVC 实践 标签 : Java与Web Converter Spring MVC的数据绑定并非没有任何限制, 有案例表明: Spring在如何正确绑定数据方面是杂乱无章的. 比如: S ...
- Android自动打包工具aapt详解
概念 在Android.mk中有LOCAL_AAPT_FLAGS配置项,在gradle中也有aaptOptions,那么aapt到底是干什么的呢? aapt即Android Asset Packagi ...
- Unity3d导出Recast geomset.txt
Unity3d导出Recast geomset.txt (金庆的专栏) Recast Demo 输入需要 geomset.txt 文件来指定区域类型. 以ObjExporter.cs为基础,编写Uni ...
- 百度编辑器UEditor常用设置函数
最近在研究UEditor的使用,下面是附上传送门: 这是API文档http://ueditor.baidu.com/doc/ 这是下载地址http://ueditor.baidu.com/websit ...
- PLSQL程序编写杂烦数据表信息编写批量排版
--PLSQL程序编写杂烦数据表信息编写批量排版 SELECT 'cra.' || lower(t.column_name) ||',' FROM dba_tab_columns t WHERE t. ...
- EJB_开发消息驱动bean
开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...
- Runtime系列(二)--Runtime的使用场景
Runtime 理解介绍的文章非常多,我只想讲讲Runtime 可以用在哪里,而我在项目里哪些地方用到了runtime.多以实际使用过程为主,来介绍runtime的使用. * 那么runtime 怎么 ...