加载超大超长图片(本地、在线)---使用第三方subsampling-scale-image-view

参考学习网址:
关于Andorid加载高清大图(仿sina weibo 里面的长图效果) - CSDN博客 http://blog.csdn.net/t1623183652/article/details/50037351

GitHub网址:
GitHub - davemorrissey/subsampling-scale-image-view: Android library (AAR). Highly configurable, easily extendable deep zoom view for displaying huge images without loss of detail. Perfect for photo galleries, maps, building plans etc. https://github.com/davemorrissey/subsampling-scale-image-view

这个控件只能加载本地图片,如果你想加载网络图片,则可以获得网络图片的缓存文件再通过它加载出来就是了。

尝试用了Glide、PhotoView、ImageLoader等等方法,一般图片都能勉强加载出来,但就是高清超长图加载不出来,界面一片黑;使用LargeImageView把图片加载出来了,但很卡,ε=(´ο`*)))唉操作太不理想了。就在一筹莫展地时候,突然神奇地发现了subsampling-scale-image-view(第一次听说),马上试了一下,太棒啦,加载高清长图完全没压力。废话不多说了,直接上具体的使用步骤。

具体步骤:

这个控件有双指缩放、双击缩放的功能!!!
1.添加依赖:

compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'

2.布局:

<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
        android:id="@+id/subsampling_scale_image_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

3.加载本地图片:

subsamplingScaleImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);              subsamplingScaleImageView.setMinScale(0.1F);//最小显示比例
subsamplingScaleImageView.setMaxScale( 5.0f);//最大显示比例
File file = new File(saveFilePath); 
// 将图片文件给SubsamplingScaleImageView,这里注意设置ImageViewState设置初始显示比例                     
// ImageViewState的三个参数为:scale,center,orientation 
 subsamplingScaleImageView.setImage(ImageSource.uri(Uri.fromFile(file)),new ImageViewState(1.0f, new PointF(0, 0), 0));

4.加载网络图片
subsampling-scale-image-view控件只能加载本地图片,但它能加载缓存里面的文件,所以通过Glide获取到缓存文件,再用它显示出来؏؏☝ᖗ乛◡乛ᖘ☝؏؏ 嫌缓存文件占存储空间,不用的时候删掉就是了呗,反正就一句话的事儿
为Glide添加依赖:

compile 'com.github.bumptech.glide:glide:3.7.0'

具体代码:
先用Glide获取到图片的硬盘缓存后,再用控件显示出来。

Glide.with(ActImage.this).load(图片网址).downloadOnly(new SimpleTarget<File>() {
                        @Override
                        public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {                                                                               
                            subsamplingScaleImageView.setImage(ImageSource.uri(resource.getAbsolutePath()),
                                    new ImageViewState(1.0f, new PointF(0, 0), 0));
                        }
                    });

在退出此界面时,删除Glide缓存的图片硬盘文件。

private File imageCacheFile;
imageCacheFile = resource;
//清除Glide硬盘缓存的图片文件
        if(imageCacheFile != null){
            imageCacheFile.delete();
        }

补充:
根据图片自身大小,计算其缩放比例,使其宽度与屏幕宽度一致;这样你在初次显示图片的时候就可以设置其与屏幕同宽了。

 /**
     * 计算出图片初次显示需要放大倍数
     * @param imagePath 图片的绝对路径
     */
    public float getInitImageScale(String imagePath){
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
        WindowManager wm = this.getWindowManager();
        int width = wm.getDefaultDisplay().getWidth();
        int height = wm.getDefaultDisplay().getHeight();
        // 拿到图片的宽和高
        int dw = bitmap.getWidth();
        int dh = bitmap.getHeight();
        float scale = 1.0f;
        //图片宽度大于屏幕,但高度小于屏幕,则缩小图片至填满屏幕宽
        if (dw > width && dh <= height) {
            scale = width * 1.0f / dw;
        }
        //图片宽度小于屏幕,但高度大于屏幕,则放大图片至填满屏幕宽
        if (dw <= width && dh > height) {
            scale = width * 1.0f / dw;
        }
        //图片高度和宽度都小于屏幕,则放大图片至填满屏幕宽
        if (dw < width && dh < height) {
            scale = width * 1.0f / dw;
        }
        //图片高度和宽度都大于屏幕,则缩小图片至填满屏幕宽
        if (dw > width && dh > height) {
            scale = width * 1.0f / dw;
        }
        return scale;
    }

把图片的最大放大比例设置为其填满屏幕宽度后再加2.0f;图片初次显示时从屏幕左上角开始显示,并且正好填满屏幕的宽度。

float initImageScale = getInitImageScale(saveFilePath);                      subsamplingScaleImageView.setMaxScale(initImageScale + 2.0f);//最大显示比例                       subsamplingScaleImageView.setImage(ImageSource.uri(Uri.fromFile(file)),new ImageViewState(initImageScale, new PointF(0, 0), 0));
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值