1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高。

2. 下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:

    步骤:

• 新建一个SmartImageView类,让继承自ImageView(放置特定的包下);

• 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出现问题,同时子类不能剥夺父类的构造方法;

• 扩展功能方法setImageUrl,通过设置一个网络的路径给SmartImageView,SmartImageView会自动的把这个路径对应的图片下载下来;

3. 下面我结合一个具体的案例形象说明一下:

(1)新建一个Android工程,命名为" 网易新闻客户端_自定义控件(SmartImageView)",同时新建一个类为SmartImageView让它继承自ImageView,这里我们暂时不必理会布局文件activity_main.xml和MainActivity.java;

如下图:

(2)接下来我们编写SmartImageView,扩展ImageView的功能:

  1. package com.himi.smart;
  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import android.content.Context;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.util.AttributeSet;
  11. import android.widget.ImageView;
  12. /**
  13. * 实现一个子类,扩展系统的ImageView
  14. * @author Administrator
  15. *
  16. */
  17. public class SmartImageView extends ImageView {
  18. private static final int SUCCESS = 1;
  19. private Handler handler = new Handler() {
  20. public void handleMessage(android.os.Message msg) {
  21. switch (msg.what) {
  22. case SUCCESS:
  23. Bitmap bitmap = (Bitmap) msg.obj;
  24. setImageBitmap(bitmap);
  25. break;
  26. default:
  27. //其他消息,都是获取图片失败
  28. break;
  29. }
  30. };
  31. };
  32. public SmartImageView(Context context, AttributeSet attrs, int defStyle) {
  33. super(context, attrs, defStyle);
  34. // TODO 自动生成的构造函数存根
  35. }
  36. public SmartImageView(Context context, AttributeSet attrs) {
  37. super(context, attrs);
  38. // TODO 自动生成的构造函数存根
  39. }
  40. public SmartImageView(Context context) {
  41. super(context);
  42. // TODO 自动生成的构造函数存根
  43. }
  44. /**
  45. * 设置一个网络的路径给imageview,imageview会自动的把这个路径对应的图片下载下来
  46. * @param path 图片的路径
  47. */
  48. public void setImageUrl(final String path) {
  49. new Thread() {
  50. public void run() {
  51. try {
  52. URL url = new URL(path);
  53. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
  54. conn.setConnectTimeout(5000);
  55. conn.setReadTimeout(5000);
  56. conn.setRequestMethod("GET");
  57. int code = conn.getResponseCode();
  58. if(code ==200) {
  59. InputStream is = conn.getInputStream();//获得服务器端的图片文件的输入流
  60. Bitmap bitmap = BitmapFactory.decodeStream(is);//将服务器端的图片文件的输入流 转化为 Bitmap图片文件
  61. //setImageBitmap(bitmap);子线程不能更新UI,这里要使用消息机制
  62. Message msg = Message.obtain();
  63. msg.obj = bitmap;
  64. msg.what = SUCCESS;
  65. handler.sendMessage(msg);
  66. }
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. handler.sendEmptyMessage(0);
  70. }
  71. };
  72. }.start();
  73. }
  74. }

这里我们上面说过了我们最好实现全部的构造方法,在扩展方法setImageUrl():它是利用网络路径(String),获取网络上的图片资源,这里用到了网络操作,必然是耗时的操作,我们定义的SmartImageView到时候必然运行在主线程,我们知道网络操作不能放在主线程(UI主线程),所以这里新建了一个子线程new Thread()再结合handler(消息机制)实现UI更新。

(3)接下来我们回到activity_main.xml布局文件:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.himi.smart.MainActivity" >
  6. <com.himi.smart.SmartImageView
  7. android:id="@+id/iv"
  8. android:layout_centerHorizontal="true"
  9. android:layout_centerVertical="true"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:text="@string/hello_world" />
  13. </RelativeLayout>

添加一个我们定义的SmartImageView控件,设置其他参数和ImageView一样(SmartImageView继承自ImageView),这里特别注意:

开始标签是 " 包名+控件类名 ",比如这里的是:

<com.himi.smart.SmartImageView 

          android:id="@+id/iv"

          android:layout_centerHorizontal="true"

          android:layout_centerVertical="true"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:text="@string/hello_world" />

(4)接下来自然是使用,回到MainActivity.java:

  1. package com.himi.smart;
  2. import com.himi.hebao.R;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.widget.ImageView;
  6. public class MainActivity extends Activity {
  7. private SmartImageView iv;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. iv = (SmartImageView) findViewById(R.id.iv);
  13. iv.setImageUrl("http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf51ebc1c2be8e5494eef01f7a94.jpg");
  14. }
  15. }

这里的"http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf51ebc1c2be8e5494eef01f7a94.jpg"是网络图片的路径,如下:

(5)不要忘记在AndroidManifest.xml添加网络权限: <uses-permission android:name="android.permission.INTERNET"/>

布署程序到模拟器上面:

备注:这里编写的SmartImageView是为了后面Android(java)学习笔记205网易新闻UI实现的扩展类,下篇就是详细说明如何编写一个网易新闻的客户端

 

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)的更多相关文章

  1. Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

    1. 有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高 ...

  2. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...

  3. Java 学习笔记 ------第六章 继承与多态

    本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...

  4. Java学习笔记(九)——继承

    一.继承 1.概念: 继承是类于类之间的关系,是一种"is a "的关系 Ps: Java是单继承 2.优势: (1)子类直接拥有父类的所有属性和方法(除了privata) (2) ...

  5. Java学习笔记day06_自定义类_ArrayList

    1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...

  6. Java学习笔记之封装与继承

    封装 1,将属性定义为私有的(private)   不能通过  对象名.属性  来直接访问,但是可以通过方法来间接的访问, 2,封装的意义:公有属性可以被随意修改,并且不能被程序察觉.封装后,别人通过 ...

  7. [core java学习笔记][第五章继承]

    5.1 类.超类和子类 定义 class Manager extends Employee { 添加方法和域 } 权限 派生类不能使用基类的私有变量 派生类调用基类的方法 利用super这个关键词 s ...

  8. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  9. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

随机推荐

  1. WebApi学习总结系列第三篇(Http)此篇持续更新...

    越了解Http对WebApi开发就越有帮助,因为WebApi就是建立在Http基础之上的. 一.Http: 通过 <ASP.NET Web API 2 框架揭秘>一书中 了解到 什么叫We ...

  2. Python/Keras如何将给定的数据集打乱

    给定数据集data,数据集对应的标签label index = [i for i in range(len(data))] random.shuffle(index) data = data[inde ...

  3. UFLDL教程之(三)PCA and Whitening exercise

    Exercise:PCA and Whitening 第0步:数据准备 UFLDL下载的文件中,包含数据集IMAGES_RAW,它是一个512*512*10的矩阵,也就是10幅512*512的图像 ( ...

  4. 用wpf实现了多个excel文件的合并

    最近公司做了一个微信红包的项目,其中一个主要的工作内容是 将238万张券导入到微信平台里面,用于微信卡券的领取和核销.但是提供给我的券都是以一个个的excel文件给到的.然后通过excel文件的导入功 ...

  5. jx3dps开发日记

    2014.11.13 子级过滤 关于optgroup这个东西,一开始以为是个包裹元素,但是一般来说,包裹元素给一个class,那么让这个class show()应该它包裹的元素也跟随show,可结果是 ...

  6. spm使用之三spm应用实例

    spm 的init实际上是调用了grunt这个工具来实现一些交互式的提问和数据的获取. 看看npm就知道, npm有个命令叫init, 就是一样的交互式提问获取你要创建的nodejs的模块信息. sp ...

  7. PHP 如何安全的使用 MySQL ?

    大多数 PHP 程序员对 MySQL 肯定不陌生,至于各种 MySQL 函数的用法在开发手册和 w3school 这类网站上也有很多介绍.但是,你所用的写法真的安全吗?面对越来越猖獗的黑客攻击,SQL ...

  8. Altium Designer 定义板子外框

    Altium Designer 提供多种定义板子外形的方法. 第一种方法,在Files 面板(在界面下面System菜单条中查找)中选择PCB Templates命令.在这个界面下您可以选择符合您设计 ...

  9. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  10. Android日志框架darks-logs使用教程

    一.配置文件 在使用darks-logs之前,我们需要为它创建一个名叫logd.properties的配置文件.如果你是需要在JAVA或WEB上使用该组件,那么你可以像配置log4j一样将它放在cla ...