接上一篇,我们来处理一下微博中的图片部分。
前文中我们利用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框架带给开发人员的灵活程度。
附上全部的源码和资源供参考(该程序在MOTOROLA milestone Android 2.1上进行了测试,其中的部分资源来源于新浪微博,仅供学习测试之用)。
点此下载源码
——欢迎转载,转载请注明出处 http://blog.csdn.net/caowenbin ——