Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
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的功能:
package com.himi.smart; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.ImageView; /**
* 实现一个子类,扩展系统的ImageView
* @author Administrator
*
*/
public class SmartImageView extends ImageView { private static final int SUCCESS = 1;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case SUCCESS:
Bitmap bitmap = (Bitmap) msg.obj;
setImageBitmap(bitmap);
break; default:
//其他消息,都是获取图片失败
break;
} };
}; public SmartImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO 自动生成的构造函数存根
} public SmartImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO 自动生成的构造函数存根
} public SmartImageView(Context context) {
super(context);
// TODO 自动生成的构造函数存根
} /**
* 设置一个网络的路径给imageview,imageview会自动的把这个路径对应的图片下载下来
* @param path 图片的路径
*/ public void setImageUrl(final String path) {
new Thread() {
public void run() {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
if(code ==200) {
InputStream is = conn.getInputStream();//获得服务器端的图片文件的输入流
Bitmap bitmap = BitmapFactory.decodeStream(is);//将服务器端的图片文件的输入流 转化为 Bitmap图片文件
//setImageBitmap(bitmap);子线程不能更新UI,这里要使用消息机制
Message msg = Message.obtain();
msg.obj = bitmap;
msg.what = SUCCESS;
handler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(0);
} };
}.start();
} }
这里我们上面说过了我们最好实现全部的构造方法,在扩展方法setImageUrl():它是利用网络路径(String),获取网络上的图片资源,这里用到了网络操作,必然是耗时的操作,我们定义的SmartImageView到时候必然运行在主线程,我们知道网络操作不能放在主线程(UI主线程),所以这里新建了一个子线程new Thread()再结合handler(消息机制)实现UI更新。
(3)接下来我们回到activity_main.xml布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.himi.smart.MainActivity" > <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" /> </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:
package com.himi.smart; import com.himi.hebao.R; import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView; public class MainActivity extends Activity { private SmartImageView iv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); iv = (SmartImageView) findViewById(R.id.iv);
iv.setImageUrl("http://a.hiphotos.baidu.com/image/pic/item/cf1b9d16fdfaaf51ebc1c2be8e5494eef01f7a94.jpg"); } }
这里的"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)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)的更多相关文章
- Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. ...
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
- Java 学习笔记 ------第六章 继承与多态
本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...
- Java学习笔记(九)——继承
一.继承 1.概念: 继承是类于类之间的关系,是一种"is a "的关系 Ps: Java是单继承 2.优势: (1)子类直接拥有父类的所有属性和方法(除了privata) (2) ...
- Java学习笔记day06_自定义类_ArrayList
1.自定义类class 使用类的形式, 对现实中的事物进行描述. 类是引用数据类型. 事物: 方法,变量. 方法:事物具备的功能. 变量:事物的属性. 格式: public class 类名{ //属 ...
- Java学习笔记之封装与继承
封装 1,将属性定义为私有的(private) 不能通过 对象名.属性 来直接访问,但是可以通过方法来间接的访问, 2,封装的意义:公有属性可以被随意修改,并且不能被程序察觉.封装后,别人通过 ...
- [core java学习笔记][第五章继承]
5.1 类.超类和子类 定义 class Manager extends Employee { 添加方法和域 } 权限 派生类不能使用基类的私有变量 派生类调用基类的方法 利用super这个关键词 s ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
随机推荐
- _beginThreadex的用法
http://blog.csdn.net/cjcy1984001/article/details/6675669 线程开始和停止函数! unsigned long _beginthreadex( v ...
- C/C++内存检测工具Valgrind
内存检测Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward, 它包含一个内核 ...
- Angular6在自定义指令中使用@HostBingDing() 和@HostListener()
emmm,,,最近在为项目的第二阶段铺路,偶然看到directive,想想看因为项目已经高度集成了第三方组件,所以对于自定义指令方面的经验自己实在知之甚少,后面经过阅读相关资料,总结一篇关于在自定义指 ...
- WindApi2 , WindOriginalApiLibrary 突然不兼容问题
1. 在新的电脑上从tfs拉下代码后编译, windoriginalapilibrary 这个工程弹出对话框,要求转为vs2013编译,选择同意,编译成功 2.WindApi2 的Reference列 ...
- DMOJ IOI '17 P3 - Toy Train【拓扑排序】
传送:https://dmoj.ca/problem/ioi17p3 参考:https://blog.csdn.net/qq_27327327/article/details/80711824 妙啊- ...
- 记一次因证书问题导致请求失败问题SSLHandshakeException
记一次因证书问题导致请求失败问题SSLHandshakeException 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10989813.html 最近接一外 ...
- python连接redis数据库的两种方式
代码: # __author__ = 'STEVEN' import redis # 方式1,直接连接 # r = redis.Redis(host='192.168.43.22',port=6379 ...
- [题解](gcd/lcm)luogu_P1072_Hankson的趣味题(NOIP2009)
连续三次不开longlong导致wa!!! 不开longlong一时爽,一会提交火葬场!!! OI千万条,longlong第一条 乘法不longlong,提交两行泪 暴力luogu就能过了???打好暴 ...
- [題解](貪心/堆)luogu_P2107小Z的AK計劃
清明講過一道類似的,難度略大的:P3545 [POI2012]HUR-Warehouse Store 兩道題類似,都是暫時先把前面的加進候選集合里,如果超出限制的話就拿現在這個和前面的交換, 相當於不 ...
- Day2课后作业:三级菜单简单版
menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, '谷歌':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youku':{ ...