1. public class ImgLabelActivity extends Activity {
  2. private static final String TAG = "ImgLabelActivity";
  3. /**本地图片*/
  4. private TextView mTvOne;
  5. /**项目资源图片*/
  6. private TextView mTvTwo;
  7. /**网络图片*/
  8. private TextView mTvThree;
  9. /**网络图片name*/
  10. private String picName = "networkPic.jpg";
  11. /**网络图片Getter*/
  12. private NetworkImageGetter mImageGetter;
  13. /**网络图片路径*/
  14. private String htmlThree = "网络图片测试:" + "<img src='http://img.my.csdn.net/uploads/201307/14/1373780364_7576.jpg'>";
  15.  
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_img_label);
  20.  
  21. mTvOne = (TextView) this.findViewById(R.id.tv_img_label_one);
  22. String htmlOne = "本地图片测试:" + "<img src='/mnt/sdcard/imgLabel.jpg'>";
  23. mTvOne.setText(Html.fromHtml(htmlOne, new LocalImageGetter(), null));
  24.  
  25. mTvTwo = (TextView) this.findViewById(R.id.tv_img_label_two);
  26. String htmlTwo = "项目图片测试:" + "<img src=""+R.drawable.imagepro+"">";
  27. mTvTwo.setText(Html.fromHtml(htmlTwo, new ProImageGetter(), null));
  28.  
  29. mTvThree = (TextView) this.findViewById(R.id.tv_img_label_three);
  30. mImageGetter = new NetworkImageGetter();
  31. mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));
  32. }
  33. /**
  34. * 本地图片
  35. * @author Susie
  36. */
  37. private final class LocalImageGetter implements Html.ImageGetter{
  38.  
  39. @Override
  40. public Drawable getDrawable(String source) {
  41. // 获取本地图片
  42. Drawable drawable = Drawable.createFromPath(source);
  43. // 必须设为图片的边际,不然TextView显示不出图片
  44. drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
  45. // 将其返回
  46. return drawable;
  47. }
  48. }
  49. /**
  50. * 项目资源图片
  51. * @author Susie
  52. */
  53. private final class ProImageGetter implements Html.ImageGetter{
  54.  
  55. @Override
  56. public Drawable getDrawable(String source) {
  57. // 获取到资源id
  58. int id = Integer.parseInt(source);
  59. Drawable drawable = getResources().getDrawable(id);
  60. drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
  61. return drawable;
  62. }
  63. }
  64. /**
  65. * 网络图片
  66. * @author Susie
  67. */
  68. private final class NetworkImageGetter implements Html.ImageGetter{
  69.  
  70. @Override
  71. public Drawable getDrawable(String source) {
  72.  
  73. Drawable drawable = null;
  74. // 封装路径
  75. File file = new File(Environment.getExternalStorageDirectory(), picName);
  76. // 判断是否以http开头
  77. if(source.startsWith("http")) {
  78. // 判断路径是否存在
  79. if(file.exists()) {
  80. // 存在即获取drawable
  81. drawable = Drawable.createFromPath(file.getAbsolutePath());
  82. drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
  83. } else {
  84. // 不存在即开启异步任务加载网络图片
  85. AsyncLoadNetworkPic networkPic = new AsyncLoadNetworkPic();
  86. networkPic.execute(source);
  87. }
  88. }
  89. return drawable;
  90. }
  91. }
  92. /**
  93. * 加载网络图片异步类
  94. * @author Susie
  95. */
  96. private final class AsyncLoadNetworkPic extends AsyncTask<String, Integer, Void>{
  97.  
  98. @Override
  99. protected Void doInBackground(String... params) {
  100. // 加载网络图片
  101. loadNetPic(params);
  102. return null;
  103. }
  104.  
  105. @Override
  106. protected void onPostExecute(Void result) {
  107. super.onPostExecute(result);
  108. // 当执行完成后再次为其设置一次
  109. mTvThree.setText(Html.fromHtml(htmlThree, mImageGetter, null));
  110. }
  111. /**加载网络图片*/
  112. private void loadNetPic(String... params) {
  113. String path = params[0];
  114.  
  115. File file = new File(Environment.getExternalStorageDirectory(), picName);
  116.  
  117. InputStream in = null;
  118.  
  119. FileOutputStream out = null;
  120.  
  121. try {
  122. URL url = new URL(path);
  123.  
  124. HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();
  125.  
  126. connUrl.setConnectTimeout(5000);
  127.  
  128. connUrl.setRequestMethod("GET");
  129.  
  130. if(connUrl.getResponseCode() == 200) {
  131.  
  132. in = connUrl.getInputStream();
  133.  
  134. out = new FileOutputStream(file);
  135.  
  136. byte[] buffer = new byte[1024];
  137.  
  138. int len;
  139.  
  140. while((len = in.read(buffer))!= -1){
  141. out.write(buffer, 0, len);
  142. }
  143. } else {
  144. Log.i(TAG, connUrl.getResponseCode() + "");
  145. }
  146. } catch (Exception e) {
  147. e.printStackTrace();
  148. } finally {
  149.  
  150. if(in != null) {
  151. try {
  152. in.close();
  153. } catch (IOException e) {
  154. e.printStackTrace();
  155. }
  156. }
  157. if(out != null) {
  158. try {
  159. out.close();
  160. } catch (IOException e) {
  161. e.printStackTrace();
  162. }
  163. }
  164. }
  165. }
  166. }

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. 【linux】who&&w

    who和w 看到目前服务器所登陆的用户,区别是w能看到更详细的信息. [root@andon tmp]# who admin tty5[tty指本地登陆] 2016-05-27 15:16[登陆时间] ...

  2. 如何设置DNS的SPF记录

    如何设置DNS的SPF记录 Introduction SPF的完整意思为 "Sender Policy Framework".翻译过来就是发送方策略框架,是一项跟 DNS 相关的技 ...

  3. txt用Itunes同步到IPhone上

    纯水的LGF160s换了IPhone 5,想把原来txt的文件拷到手机上.百度只是有老版本的,最新也是11的.现在用12.06版的,菜单已经不太一样.找了半天,分享一下.

  4. 使用eclipse创建java程序可执行jar包

    一.eclipse中,在要打成jar包的项目名上右击,出现如下弹出框,选择“export”: 二.在接下来出现的界面中点击“jar file”,然后next: 三.在接下来出现的界面中,如图所示勾选上 ...

  5. Hadoop学习3--安装ssh服务

    题前语:为什么要安装这个东西呢? 是因为我们要在多台机器之间通信,这个服务就相当于支持这种通信的一个桥梁,打个比喻,相当于windows里,通过远程桌面连接到其他机器. 所以,安装这个服务,的目的是: ...

  6. 黄聪:wordpress工作原理

    WP初始化的过程:当你输入<yourlink>/wordpress对wordpress进行初始化时,wordpress默认会找根目录下的index.php页面,看一下index.php页面 ...

  7. jsch ssh服务器调用Linux命令或脚本的小问题

    代码如下: public static boolean execshell(String command, String user, String passwd, String host) throw ...

  8. PLSQL_基础系列08_操作符标LPAD / TRUNC / DECODE / TRIM / INSTR(案例)

    2014-12-09 Created By BaoXinjian

  9. IGS_学习笔记03_Integrated SOA Gateway设定配置(案例)

    20150506 Created By BaoXinjian

  10. Codeforces Round #367 (Div. 2) Hard problem

    Hard problem 题意: 有n个字符串,对第i个字符串进行反转操作代价为ci. 要使n个字符串按照字典序从小到大排列,最小的代价是多少. 题解: 反转就是reverse操作,比如说45873反 ...