一、基础准备
1.素材准备
1.空Activity的新建,参照上篇2.准备照片
可以网络获取,也可从自己服务器取,这里我放置在了自己的树莓派上,因为性能带宽问题加载较慢,请务必换成自己寻找的网络照片。
新建一个Image类放地址,后期将改作Json获取解析,以便后期数据更新。
二、代码编写
1.ImageLoader类
对图片加载进行管理,参考自郭神博客。
2.MyScrollView类
滚动视图,较为简单的滑动空间,用于上下滑加载新的图片。
MyScrollView是实现瀑布流照片墙的核心类。首先它是继承自ScrollView的,这样就允许用户可以通过滚动的方式来浏览更多的图片。这里提供了一个loadMoreImages()方法,是专门用于加载下一页的图片的,因此在onLayout()方法中我们要先调用一次这个方法,以初始化第一页的图片。然后在onTouch方法中每当监听到手指离开屏幕的事件,就会通过一个handler来对当前ScrollView的滚动状态进行判断,如果发现已经滚动到了最底部,就会再次调用loadMoreImages()方法去加载下一页的图片。
那我们就要来看一看loadMoreImages()方法的内部细节了。在这个方法中,使用了一个循环来加载这一页中的每一张图片,每次都会开启一个LoadImageTask,用于对图片进行异步加载。然后在LoadImageTask中,首先会先检查一下这张图片是不是已经存在于SD卡中了,如果还没存在,就从网络上下载,然后把这张图片存放在LruCache中。接着将这张图按照一定的比例进行压缩,并找出当前高度最小的一列,把压缩后的图片添加进去就可以了。
另外,为了保证照片墙上的图片都能够合适地被回收,这里还加入了一个可见性检查的方法,即checkVisibility()方法。这个方法的核心思想就是检查目前照片墙上的所有图片,判断出哪些是可见的,哪些是不可见。然后将那些不可见的图片都替换成一张空图,这样就可以保证程序始终不会占用过高的内存。当这些图片又重新变为可见的时候,只需要再从LruCache中将这些图片重新取出即可。如果某张图片已经从LruCache中被移除了,就会开启一个LoadImageTask,将这张图片重新加载到内存中。
3.流布局
4.使用权限
三、效果图
领取专属 10元无门槛券
私享最新 技术干货