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();
}
}
}
}
}

Html类ImageGetter接口的更多相关文章

  1. 为什么类和接口不能使用private和protected?接口的方法不能使用private、protected、default

    对于java程序员来说,java的访问权限修饰词public.protected.default.private的区别和使用肯定都不是问题,这里也不再啰嗦了,反正度娘一搜就一大把.最近在整理java ...

  2. C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义

    类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...

  3. Effective java笔记(三),类与接口

    类与接口是Java语言的核心,设计出更加有用.健壮和灵活的类与接口很重要. 13.使类和成员的可访问性最小化 设计良好的模块会隐藏起所有的实现细节,仅使用API与其他模块进行通信.这个概念称为信息隐藏 ...

  4. java类,接口浅谈

    一般类,抽象类,接口的使用场景: 类;共同的特征和行为的抽取和封装 接口:标准,规范(功能的扩展)         需要对某个类进行功能的扩展,就让某个类实现这个接口,抽取出来称为接口   内部类: ...

  5. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...

  6. PHP面向对象学习五 类中接口的应用

    类中接口的应用 接口:一种成员属性全部为抽象的特殊抽象类,在程序中同为规范的作用   抽象类:1.类中至少有一个抽象方法.2.方法前需要加abstract 接口: 1.类中全部为抽象方法,抽象方法前不 ...

  7. C#类、接口、虚方法和抽象方法0322

    虚拟方法和抽象方法有什么区别与联系: 1.抽象方法只有声明没有实现代码,需要在子类中实现:虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现. 2.抽象类不能被实例化(不可 ...

  8. Java知多少(107)几个重要的java数据库访问类和接口

    编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中 ...

  9. Java高效编程之三【类和接口】

    本部分包含的一些指导原则,可以帮助哦我们更好滴利用这些语言元素,以便让设计出来的类更加有用.健壮和灵活. 十二.使类和成员的访问能力最小化 三个关键词访问修饰符:private(私有的=类级别的).未 ...

随机推荐

  1. centos curl版本nss改成openssl

    在centos 6.2的系统里面的curl支持的https是nss版本的,而不是openssl的,所以在php使用curl访问https的时候会报Unable to load client key - ...

  2. 【shell】nmap工具的使用

    NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工 具包,其基本功能有三个,一是探测一组主机是否在线:其次是扫描主机端口,嗅探所提供的网络服务:还可以推断主机所用的操作系统 ...

  3. SSH_框架整合2—查询显示

    4. 完成功能. (1)com.atguigu.ssh.actions包下新建EmployeeAction.java package com.atguigu.ssh.actions; import j ...

  4. 求助:为什么我用360浏览器和UC浏览器打不开JAVA中的index.html文件? 一打开就显示浏览器首界页

    如下图,在oracle官网下载了一个JAVA的API文档,双击index.html时打开是浏览器的首页,不知道为什么?请问怎样才能以chm文档格式显示?

  5. Maven本地安装JAR包组件

    http://www.mkyong.com/maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/ mvn instal ...

  6. js复习(一)

    一.常用数据框1.alert(""):警告对话框,作用是弹出一个警告对话框 2.confirm(""):确定对话框,弹出一个带确定和取消按钮的对话框--确定返回 ...

  7. DB2 SQL性能调优秘笈

    SQL优化技巧 1.去除在谓词列上编写的任何标量函数 2.去除在谓词列上编写的任何数学运算 3.SQL语句的Select部分只写必要的列 4.尽可能不用Distinct 5.尽量将In子查询重写为Ex ...

  8. A^B问题

    题目:输入包括两个正整数 A 和 B(1 <= A, B <= 10000),A 和 B 之前用空格隔开 ★数据输出 输出一行,若 A ^ B < 10000,则直接输出结果(不包含 ...

  9. JAVA 想让类无法new,可以使用private将类的构造函数改为私有的,这样new的时候就会报错了

    JAVA 想让类无法new,可以使用private将构造函数改为私有的,这样new的时候就会报错了 主要用于,静态工具类,静态类不需要new,直接使用   类名.静态方法  即可调用 class D{ ...

  10. Android之Service

    1.自定义Service类 package com.example.mars_2000_service; import android.app.Service; import android.cont ...