SubsamplingScaleImageView + Glide显示网络超大图片
SubsamplingScaleImageView自身只支持本地图片的加载,但项目中还需要显示网络图片,不想分情况选用不同的控件,所以通过Glide将图片下载到本地缓存再显示,Glide使用如下代码可以直接获取缓存file:
这个控件有双指缩放、双击缩放的功能!!!
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'
//使用Glide下载图片,保存到本地Glide.with(context).download(uri).into(new SimpleTarget<File>() {@Overridepublic void onLoadFailed(@Nullable Drawable errorDrawable) {super.onLoadFailed(errorDrawable);Log.d("加载失败");}@Overridepublic void onResourceReady(File resource, Transition<? super File> transition) {mPlaceHolder.setVisibility(GONE);// ImageViewState的三个参数为:scale,center,orientation// subsamplingScaleImageView.setImage(ImageSource.uri(Uri.fromFile(file)),new ImageViewState(1.0f, new PointF(0, 0), 0));// imageView.setImage(ImageSource.uri(resource.getAbsolutePath()));// 最大显示比例imageView.setMaxScale(10f);}
});
可以在退出此界面时,删除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);//最大显示比例
// ImageViewState的三个参数为:scale,center,orientation
subsamplingScaleImageView.setImage(ImageSource.uri(Uri.fromFile(file)),new ImageViewState(initImageScale, new PointF(0, 0), 0));
另外我们还可以设置双击图片的缩放系数以及监听移动
示例
public class MainActivity extends AppCompatActivity {private SubsamplingScaleImageView mageView;@SuppressLint("CheckResult")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String sUrl = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1532588239&di=78b4c6bde1cf9d1df89562241b547e72&src=http://p2.qhimg.com/t011fc13354f12d1a46.jpg";mageView = (SubsamplingScaleImageView) findViewById(R.id.imageview);mageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM);mageView.setMinScale(1.0F);//下载图片保存到本地Glide.with(this).load(sUrl).downloadOnly(new SimpleTarget<File>() {@Overridepublic void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) {// 将保存的图片地址给SubsamplingScaleImageView,这里注意设置ImageViewState设置初始显示比例mageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(2.0F, new PointF(0, 0), 0));}});
}}
扩展:
快速解决办法----使用WebView加载大图
我们都知道, 移动端显示的图片都是加载一个图片的网络地址, 如果这样,我们为何不直接使用WebView的特性, 直接加载这个图片地址呢??
WebView webView = (WebView) findViewById(R.id.webView);
webView.loadUrl("http://192.168.3.162:8080/gotoclass/test.jpg");
但是如果仅仅这么做, 图片很有可能会在宽度上出现问题, 所以要让它适应屏幕缩放:
WebSettings settings = webView.getSettings();
// 设置可任意缩放
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
SubsamplingScaleImageView + Glide显示网络超大图片相关推荐
- android显示网络gif图片
为什么80%的码农都做不了架构师?>>> 这功能源自负责app中要加一个显示gif广告图功能. android自带控件不支持gif图片,网上很多通过扩展ImageView或Vi ...
- android加载网络gif图片不显示不出来的,android显示网络gif图片
这功能源自负责app中要加一个显示gif广告图功能. android自带控件不支持gif图片,网上很多通过扩展ImageView或View来实现支持gif图片,但在android4.0后,需要关闭硬件 ...
- Glide加载部分图片不显示问题
Glide版本为4及其以上 图片不显示原因 没有添加INTERNET网络权限 老版本Glide无法加载https图片(需要使用okhttp忽略证书) 图片Url无法连接 图片返回数据不全且格式不正确 ...
- 超大图片的显示:BitmapRegionDecoder 1
不少安卓开发者都有图片加载的处理经验,比如通过压缩节省图片加载中对内存的消耗. 我们经常做的是把一张1280之类大小的图片以适应屏幕大小的尺寸展现出来,同时能够通过缩放来观察. 不过这是一般水平,通过 ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
- 服务器上有图片但是app不显示不出来,网络app图片显示不出来的
网络app图片显示不出来的 内容精选 换一换 接入CDN加速后,用户访问网站或者APP资源依然很慢.域名是否接入CDN加速是否命中CDN缓存是否跨运营商和跨省缓存规则设置是否合理加速资源是否预热是否客 ...
- glide 显示图片慢_做个看图片的App玩玩_第一篇
目标 做个看图片的App,效果图如下: 本期目标 功能: 1.下载一组图片,支持上下滑动翻页 涉及技术知识点: 1. retrofit+okHttp:访问网络接口获取数据 2. coroutines: ...
- android listview网络图片,Android ListView从网络获取图片及文字显示
上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...
- android网络下载图片并且显示在图库中
1:网络下载图片 主要是练习网络编程,获取网络数据.不能使用网络资源的软件是很难有长足的发展和进步的,个人觉得,所以最近在学习网络相关的编程.这里就把我做的demo发在这里,同时我也梳理一下知识点.废 ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
最新文章
- 使用OKR管理好团队这四个高深的技巧要明白
- Python 技术篇-用imageio库实现图片转gif动画,Gif录制屏幕操作实例演示
- 从flink-example分析flink组件(3)WordCount 流式实战及源码分析
- Linux常用的基本命令vi、ps、kill(四)
- 疯狂的程序员-第三章
- 1451 - Average 高速求平均值
- [JavaWeb-CSS]CSS概述
- Java的最新发展– 2018年4月下旬
- python apscheduler执行_python apscheduler 每两小时执行一次
- SSG 550 6条公网接入的解决方法
- linux中同步例子(完成量completion)
- configServer的高可用
- python节点之间的继承关系_python--继承关系
- 汽车上都有哪些系统的缩写
- html页面加文字水印
- Linux命令 - rm命令
- S100数字源表之LDO芯片电学特性测试方案
- SpringBoot+MongoDB GridFS文件上传、下载、预览实战
- 六子棋(客家六子棋)
- OCM exam guide - OCM认证指南
热门文章
- 【Spring】源码浅析 - ResponseEntity.ok
- Status code :200 OK (from disk cache)
- c语言水仙花数pow,c语言如何解水仙花数
- 平方米的计算机公式,表格中平方米计算公式(怎么用excel计算平方)
- 跨境电商:YouTube视频营销必看攻略
- IEEEtran Latex模板五作者排版问题
- 个人网站可以申请微信授权登录吗
- 从唐虞夏商宋五字的甲骨文本意来重温那段历史。
- matlab如何看历史,matlab创建有价值历史纪录.txt 源代码在线查看 - Matlab创建有价值历史纪录(完整版),matlab 常用的命令集锦。 资源下载 虫虫电子下载站...
- 计算机控制/SLAM/ROS2云班课等详细说明2019-2020-2学期