关于Andorid加载高清大图(仿sina weibo 里面的长图效果)

用过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遍。。。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值