Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新)
2016-10-20 17:02
696 查看
PhotoView 这个项目使用起来很方便,效果很nice。 但是在项目中,结合Glide 使用的时候,发现存在一个问题,那就是:加载完成后,缩放图片的时候,图片宽高突然变得很大,与实际想要的效果完全不符。一开始还以为是没有给ImageView设置FIT-CENTER属性导致的,可是设置后还是存在这个问题。
懵逼了一会儿,仔细想了想原因。大概是因为photoView 初始化的时候测量的图片宽高出问题了,那么是什么原因导致的呢?找来找去,最终发现是因为占位图的大小和网络下载的图片大小不一致。因为下载图片是需要一定时间间隔的,由于在网络图片尚未下载完成时,就已经初始化了PhotoViewAttacher并测量了图片宽高,然而当加载图片完成后,PhotoView显示出来的是网络下载的图片,但初始化时就已经测量出的是占位图的宽高,所以图片缩放就存在问题。
如果要下载的网络图片的宽高大小是固定的,则可设置一张同等大小的占位图,则解决了问题。但是一般情况下网络图片是不确定的,因此,这种做法不太合理。我们有两种处理方法(建议使用第二种方法):
第一种方法:如果对占位图的要求是可有可无的话,可以注释掉Glide占位图的设置。(在没有加载完网络图片的时候,Photoview是空图)。
XML布局文件中,PhotoView 的父控件需要是Relativelayout,如果使用的是Linerlayout,会导致测量的PhotoView宽高为 0。
[b]第二种方法:通过给Glide设置下载进度监听,在网络图片下载完成之后,再初始化PhotoViewAttacher。[/b]
代码如下:
另外顺便提一下,原项目代码有个小问题,Demo 代码是这样的:
而在xml布局文件中,ImageView 是自定义的,所以应该改成:
懵逼了一会儿,仔细想了想原因。大概是因为photoView 初始化的时候测量的图片宽高出问题了,那么是什么原因导致的呢?找来找去,最终发现是因为占位图的大小和网络下载的图片大小不一致。因为下载图片是需要一定时间间隔的,由于在网络图片尚未下载完成时,就已经初始化了PhotoViewAttacher并测量了图片宽高,然而当加载图片完成后,PhotoView显示出来的是网络下载的图片,但初始化时就已经测量出的是占位图的宽高,所以图片缩放就存在问题。
如果要下载的网络图片的宽高大小是固定的,则可设置一张同等大小的占位图,则解决了问题。但是一般情况下网络图片是不确定的,因此,这种做法不太合理。我们有两种处理方法(建议使用第二种方法):
第一种方法:如果对占位图的要求是可有可无的话,可以注释掉Glide占位图的设置。(在没有加载完网络图片的时候,Photoview是空图)。
Glide.with(this) .load(url) /*.placeholder(R.mipmap.ic_default_man)*/ .diskCacheStrategy(DiskCacheStrategy.RESULT) .into(iv_photo);
XML布局文件中,PhotoView 的父控件需要是Relativelayout,如果使用的是Linerlayout,会导致测量的PhotoView宽高为 0。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <uk.co.senab.photoview.PhotoView android:id="@+id/iv_photo" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter"/> </RelativeLayout>
[b]第二种方法:通过给Glide设置下载进度监听,在网络图片下载完成之后,再初始化PhotoViewAttacher。[/b]
代码如下:
Glide.with(this) .load(url) .placeholder(R.mipmap.ic_default_man) // 占位图 .diskCacheStrategy(DiskCacheStrategy.RESULT)//图片缓存模式 .listener(new RequestListener() { @Override public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) { Toast.makeText(PhotoViewActivity.this, "加载头像失败,请检查网络后重试", Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onResourceReady(Object resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) { //在这里添加一些图片加载完成的操作 // The MAGIC happens here! mAttacher = new PhotoViewAttacher(iv_photo); // Lets attach some listeners, not required though! mAttacher.setOnMatrixChangeListener(new MatrixChangeListener());//缩放监听 mAttacher.setOnPhotoTapListener(new PhotoTapListener());//单击监听 //mAttacher.setOnSingleFlingListener(new SingleFlingListener());//单点双击监听 return false; } }) .into(iv_photo);
另外顺便提一下,原项目代码有个小问题,Demo 代码是这样的:
ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);
而在xml布局文件中,ImageView 是自定义的,所以应该改成:
PhotoView mImageView = (PhotoView) findViewById(R.id.iv_photo);
相关文章推荐
- 图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView
- 图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView
- 图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView
- Android中图片放大缩小(和ViewPager配合使用流畅显示)--第三方开源--PhotoView
- 解决使用CImage类的Draw函数在显示图片时引起的图像失真问题
- html的img中使用SVG图片做SRC在本地测试可用但是上传服务器后不能显示问题解决 标签: SVGMIME TYPE不显示服务器设置 2016-05-21 13:49 2517人阅读 评论(0)
- 【问题解决】使用Strust2文件上传图片无法显示
- 在Ubuntu中使用Python的matplotlib库时图片不能显示问题的解决方法
- 解决Glide加载网络圆角图片先显示完整图片的问题
- 安卓学习之使用listview设置adapter时,解决动态显示图片的问题
- 关于Glide显示默认图片的问题(circleImageView配合问题)
- Android在打开一个新的Activity浏览大图时使用ImageView/PhotoView的时候图片显示在屏幕上部的问题
- 使用JQuery解决图片自适应大小问题(比较好的解决图片从加载到完全显示的大小问题)
- 解决网通英文wiki无法显示图片问题【20100723更新】
- html的img中使用SVG图片做SRC在本地测试可用但是上传服务器后不能显示问题解决
- 图片随手势放大缩小PhotoView的使用
- Android PhtoView 图片放大缩小后,图片显示在界面上左上角的解决办法
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 解决Glide加载圆形图片,第一次只显示点位图的问题
- android 图片浏览功能 图片放大缩小 使用 photoview 双击或双指缩放的ImageView