介绍
最近写了一个Library, 用于实现在Android设备上对大图的浏览。已经实现的功能有:
1、移动、缩放图片
2、双击快速放大或缩小图片
3、单击退出浏览
4、左右滑动切换图片。
目前还只实现了展示SD卡里图片的功能,后续应该补完,使其可以展示网络图片等。
代码已经在Github上开源, 地址为:
https://github.com/lankton/lanimagebrowser
展示:
图片切换
图片缩放
实现
实现的思路很简单。图片的缩放、移动等操作通过自定义ImageView实现,这些自定义ImageView通过Fragment来展现。同时,这些Fragment被绑定到ViewPager上,从而实现对图片的切换。下面简单讲一下几个比较关键的地方。
- 自定义ImageView
主要重写了OnTouchEvent,来监听各种手势事件。同时重写了OnMeasure和OnLayout,来初始化图片在ImageView的显示。直接上代码吧。
|
|
可以看到,图片的位移及大小变换是通过修改matrix实现的,所以使用时该自定义View的scaleType被设为“matrix”。
- Fragment编写
这个,也还是直接上代码吧。。
|
|
由于工程要被拿来当作library,可以看到在onCreateView通过代码生成自定义的BrowserImageView并被设置到布局里。BrowserImageView的scaleType被设置成“matrix”。加载时,通过AsyncTask异步加载图片。
- 图片缓存
通过LruCache动态进行内存管理,否则很高概率出现OOM。缓存初始化放在了ViewPager的Adapter里:
|
|
在之前介绍Fragment的代码里可以看到如何使用LruCache的,不再赘述了。
使用
本Library主要提供了一个PagerAdapter。使用时,让该工程作为Library被需要的工程引用即可。
使用时的代码如下:
|
|
在你的布局文件里放置一个普通的ViewPager,然后使用类库提供的IPagerAdapter即可。需要传进Adapter的参数,即photos,是你本地文件的路径列表。之后该Activity就可以拿来进行图片浏览了。
就先介绍到这里吧, 这个Library目前还有不少需要改进和提升的地方,请多多指教。
最后在申明一次开源地址, 代码都可以从这里获取:
https://github.com/lankton/lanimagebrowser
更新
###解决viewpager和imageview的滑动冲突 2015 6 28###
之前版本,想直接左右拖动图片时(eg 图片放大状态,想查看未显示的部分),会直接出发viewpager的翻页事件。
解决方案:手指在imageview上move时,根据条件判断是否应该禁止viewpager的滑动事件。参考链接:requestDisallowInterceptTouchEvent
参考里viewpager直接传递进子view, 其实不用,可以直接通过getParent()获得。同时本library的情况要分别考虑左划和右划。代码如下:
|
|
已同步至git。