展会信息港展会大全

Android开发的TextView利用HTML类处理图片显示、字体样式
来源:互联网   发布日期:2015-11-15 10:25:14   浏览:2629次  

导读:1 Spanned android text Html fromHtml(String source) 输入的参数为(html格式的文本)2 Spanned android text Html fromHtml(String source, ImageGetter imageGetter, TagHandler tagHandler) So ...

1Spanned 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;

}

}

赞助本站

人工智能实验室

相关热词: TextView HTML 字体样式 Android

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港