您的位置:首页 > 移动开发 > Android开发

Android HTML.fromHtml解析图片标签

2016-05-13 09:49 363 查看
在之前Html类支持的HTML标签文章中了解到当解析到<img>标签时就会回调getDrawable()方法,并需要返回一个Drawable对象;当前我们需要定义类并实现ImageGetter接口以及在getDrawable方法中做相应的处理,下面我们则来看看具体该如何处理;

具体代码:

/**

* ImageGetter接口的使用

* @author Susie

*/

public class ImgLabelActivity extends Activity {

private static final String TAG = "ImgLabelActivity";

/**本地图片*/

private TextView mTvOne;

/**项目资源图片*/

private TextView mTvTwo;

/**网络图片*/

private TextView mTvThree;

/**网络图片name*/

private String picName = "networkPic.jpg";

/**网络图片Getter*/

private NetworkImageGetter mImageGetter;

/**网络图片路径*/

private String htmlThree = "网络图片测试:" + "<img src='http://img.my.csdn.net/uploads/201307/14/1373780364_7576.jpg'>";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_img_label);

mTvOne = (TextView) this.findViewById(R.id.tv_img_label_one);

String htmlOne = "本地图片测试:" + "<img src='/mnt/sdcard/imgLabel.jpg'>";

mTvOne.setText(Html.fromHtml(htmlOne, new LocalImageGetter(), null));

mTvTwo = (TextView) this.findViewById(R.id.tv_img_label_two);

String htmlTwo = "项目图片测试:" + "<img src=\""+R.drawable.imagepro+"\">";

mTvTwo.setText(Html.fromHtml(htmlTwo, new ProImageGetter(), null));

mTvThree = (TextView) this.findViewById(R.id.tv_img_label_three);

mImageGetter = new NetworkImageGetter();

mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));

}

/**

* 本地图片

* @author Susie

*/

private final class LocalImageGetter implements Html.ImageGetter{

@Override

public Drawable getDrawable(String source) {

// 获取本地图片

Drawable drawable = Drawable.createFromPath(source);

// 必须设为图片的边际,不然TextView显示不出图片

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

// 将其返回

return drawable;

}

}

/**

* 项目资源图片

* @author Susie

*/

private final class ProImageGetter implements Html.ImageGetter{

@Override

public Drawable getDrawable(String source) {

// 获取到资源id

int id = Integer.parseInt(source);

Drawable drawable = getResources().getDrawable(id);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

return drawable;

}

}

/**

* 网络图片

* @author Susie

*/

private final class NetworkImageGetter implements Html.ImageGetter{

@Override

public Drawable getDrawable(String source) {

Drawable drawable = null;

// 封装路径

File file = new File(Environment.getExternalStorageDirectory(), picName);

// 判断是否以http开头

if(source.startsWith("http")) {

// 判断路径是否存在

if(file.exists()) {

// 存在即获取drawable

drawable = Drawable.createFromPath(file.getAbsolutePath());

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

} else {

// 不存在即开启异步任务加载网络图片

AsyncLoadNetworkPic networkPic = new AsyncLoadNetworkPic();

networkPic.execute(source);

}

}

return drawable;

}

}

/**

* 加载网络图片异步类

* @author Susie

*/

private final class AsyncLoadNetworkPic extends AsyncTask<String, Integer, Void>{

@Override

protected Void doInBackground(String... params) {

// 加载网络图片

loadNetPic(params);

return null;

}

@Override

protected void onPostExecute(Void result) {

super.onPostExecute(result);

// 当执行完成后再次为其设置一次

mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));

}

/**加载网络图片*/

private void loadNetPic(String... params) {

String path = params[0];

File file = new File(Environment.getExternalStorageDirectory(), picName);

InputStream in = null;

FileOutputStream out = null;

try {

URL url = new URL(path);

HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();

connUrl.setConnectTimeout(5000);

connUrl.setRequestMethod("GET");

if(connUrl.getResponseCode() == 200) {

in = connUrl.getInputStream();

out = new FileOutputStream(file);

byte[] buffer = new byte[1024];

int len;

while((len = in.read(buffer))!= -1){

out.write(buffer, 0, len);

}

} else {

Log.i(TAG, connUrl.getResponseCode() + "");

}

} catch (Exception e) {

e.printStackTrace();

} finally {

if(in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if(out != null) {

try {

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

}

需要注意的是:

在获取到drawable时需要为其设置边界,如没有设置的话TextView就不能显示该drawable了;

在加载网络图片时需要开启子线程去访问网络并将图片存储到本地,之后再次为其设置一次;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: