Android创建一个WebImageView
这个WebImageView的主要功能就是一个:指定一个URI,这个控件去延迟加载并显示在该控件的位置上。。
在Github上,这种类似的框架已经非常多并且非常的具有性能性。。 本篇博文只是使用此实例简单的帮助大家理解一下这方面的工作原理。
效果图就不贴了,跟ImageView一模一样。。
内部的主要逻辑实现:
自定义控件,继承于ImageView, 内部实现一个叫做setImageBackground(String uri)的方法,定义一个内部类AsyncTask进行访问之后再设置给ImageView就好了。。 (注意: 需要加入访问网络的权限、)
整体的逻辑都说完了,就直接上代码吧。
1、继承于ImageView
public class WebImageView extends ImageView
让这个控件具有ImageView的所有能力。
2、定义成员属性
private Drawable mDrawable;
主要就是用来在setImageBackground系列方法中进行引用背景的对象,要不要这个无所谓 。
3、实现系列的setImageBackground方法
为什么说系列呢, 无论如何也不能让这个控件简单的只有给uri的时候才有用啊, 要不然就是个负担。。
public void setImageBackground(Drawable mDrawable) {
this.mDrawable = mDrawable;
setImageDrawable(this.mDrawable);
}
public void setImageBackground(int resultId) {
mDrawable = getResources().getDrawable(resultId);
setImageDrawable(mDrawable);
}
public void setImageBackground(String url) {
MyAsyncTask mAsyncTask = new MyAsyncTask();
mAsyncTask.execute(url);
}
通过这三个方法可以看出,支持三种赋值方案, 内部调用的setImageDrawable是原本的ImageView这个控件所提供的原生方法。
在接受的参数为url的时候可以看出是使用了一个AsyncTask类进行的网络访问(因为AsyncTask可以很有效的进行ui线程逻辑处理,所以此处不采用Thread+Handler处理。
MyAsyncTask是一个WebImageView的内部类、AsyncTask过于基础不进行讲解,直接给出代码。
private class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
String url = params[0];
try {
HttpURLConnection mConnection = (HttpURLConnection) (new URL(url)).openConnection();
InputStream is = mConnection.getInputStream();
return BitmapFactory.decodeStream(is);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
mDrawable = new BitmapDrawable(getResources(), result);
if (mDrawable != null) {
setImageBackground(mDrawable);
}
}
}
当然啦,代码也没有技术含量,本篇博文主要就是想告诉大家这个框架的大概结构. 练习可以采用这个写法。