接上一篇,我们来处理一下微博中的图片部分。
前文中我们利用WebView来处理URL中的图片显示,并且基本能达到目标,但是还是有一两处细节需要处理,以提升用户体验。
一是在下载图片的过程中需要显示一个背景图,让用户先知道那里会出现图片,而不是一片空白。
二是图片下来以后,要根据图片的大小动态调整显示效果,不能出现WebView太大而图片太小时的白边。
由此,我们从WebView继承一个PictureWebView专门解决上面这两个问题。
首先,我们要为这个PictureWebView实现WebView.PictureListener接口,该接口提供的
public abstract void onNewPicture(WebView view, Picture picture)
方法用于在图片改变时发出通知。代码如下,其中的picture是一个Picture类型的成员变量。
@Override
public void onNewPicture(WebView view, Picture picture) {
if (picture!=null){
this.picture=picture;
DisplayMetrics dm=getContext().getResources().getDisplayMetrics();
int width=(int) (picture.getWidth()*dm.density);
int height=(int) (picture.getHeight()*dm.density);
setPictureListener(null);
ViewGroup.LayoutParams lp=getLayoutParams();
lp.width=width;
lp.height=height;
setLayoutParams(lp);
}
}
注意到这里已经根据picture大小调整了控件的布局。因为我们这个PictureWebView的每个实例针对的只是一条微博中的图片URL,因此这里不关注WebView中其他的可显示元素。
接下来,为了更好的处理第二个问题,我们改写一下onDraw()方法,进行背景和图片的绘制。代码如下:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (picture==null){
Drawable background=this.getBackground();
if (background!=null){
background.setBounds(0,0,background.getIntrinsicWidth(),background.getIntrinsicHeight());
background.draw(canvas);
}
}
}
这样,一个定制的WebView就实现了,修改blogview.xml布局文件中的WebView控件为PictureWebView即可,代码如下:
<com.wenbin.test.PictureWebView android:id="@+id/profileImage"
android:layout_width="48dp"
android:layout_height="48dp"
android:scrollbars="none"
android:layout_alignParentLeft="true"
android:background="@drawable/portrait">
</com.wenbin.test.PictureWebView>
运行程序,无论是头像还是微博中的图片,在未下载完时是显示背景图的,下载完后会自动调整布局进行适应,而且不存在无用的边框。截图见《Android控件组合应用一》一文。
结语:本来想在一篇中写完,但篇幅太长,所以分割成了这许多部分。而且也没想到CSDN勤劳的小编在第一篇文章刚出时就盖了 推荐 的章,然后我就开始熬夜赶工了。在代码中没有注重算法之类的事情,也没有达到商用的程度,主要还是通过模仿新浪微博的客户端界面来灵活应用一下Android的控件,同时也可以看到Android框架带给开发人员的灵活程度。