用过sina微博客户端的同学都知道,它里面有一个长图功能。
需求是可以显示比如10000X10000(px)的图片。
如果你直接用bitmap加载图片文件(或者是从inputstream获取到,然后转化为bitmap),在用imageview.setBitmap(bitmap),
恭喜你会成功看到图片太大不能够加载出来的logcat信息.。
解决问题的思路:参看弘扬大神的http://blog.csdn.net/lmj623565791/article/details/49300989 文章,当然要自己写一个带手势的库(原谅我自己太菜了,没有写出来)
然后在网上找到了3个开源库:
- https://github.com/davemorrissey/subsampling-scale-image-view
- https://github.com/diegocarloslima/ByakuGallery
https://github.com/LuckyJayce/LargeImage
3个库我分别尝试了一下:
- LargeImage的长图功能里面没有放缩功能,并且大图加载的放缩的缩放点有问题,长图加缩放的功能没有(里面的源码自己没有研究懂,这个貌似是接近sina里面的效果,但是有一些bug o(╯□╰)o,如果作者有时间可以修复就好了)
- ByakuGallery设置最小的缩放值没有提供想关的函数,自己尝试加一个但是加上自己缩放的时候就出问题了,之后就没研究了
- 最终决定选用subsampling-scale-image-view
- 然后自己之前图片加载用的是glide,要配合使用subsampling-scale-image-view。自己google了一番终于找到了解决办法http://www.28im.com/android/a82597.html
glide有下载图片的功能,那就只是需要保存下图片然后在操作就行了。
打开你们的AS:
在自己的app module里面的build.gradle里面加入如下依赖:
dependencies {
compile 'com.android.support:appcompat-v7:23.+'
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.4.1'
}
final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) findViewById(R.id.imageView);
imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);
imageView.setMinScale(1.0F);
final String testUrl = "http://image.zcool.com.cn/2013/53/18/m_1385635534691.jpg";
final File downDir = Environment.getExternalStorageDirectory();
//使用Glide下载图片,保存到本地
Glide.with(this)
.load(testUrl)
.asBitmap()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
File file = new File(downDir, "/Glide/m_1385635534691.jpg");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fout = null;
try {
//保存图片
fout = new FileOutputStream(file);
resource.compress(Bitmap.CompressFormat.JPEG, 100, fout);
// 将保存的地址给SubsamplingScaleImageView,这里注意设置ImageViewState
imageView.setImage(ImageSource.uri(file.getAbsolutePath()), new ImageViewState(0.5F, new PointF(0, 0), 0));
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (fout != null) fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
不要忘记在Androidmanifest里面的加入联网权限和读写权限。。。
上面用了setMinimumScaleType,setMinScale先设置最小的缩放类型,再设置缩放的最小值;当然还有一点比较重要的是要设置它的ImageViewState 要不然你会发现默认并不是从图片的左上角开始缩放的。
也许很多人都会时候没图你说个JB啊,那还是要先看下效果图赛。下面是测试用的图片地址http://image.zcool.com.cn/2013/53/18/m_1385635534691.jpg
本来想传gif的但是gif 6M 传不上去,那就看截图吧:
最后如果你们知道更好的解决,请告诉我下,请告诉我下,请告诉我下!重要的事情说3遍。。。