我是靠谱客的博主 迷人毛巾,这篇文章主要介绍Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新),现在分享给大家,希望可以做个参考。

      PhotoView 这个项目使用起来很方便,效果很nice。 但是在项目中,结合Glide 使用的时候,发现存在一个问题,那就是:加载完成后,缩放图片的时候,图片宽高突然变得很大与实际想要的效果完全不符。一开始还以为是没有给ImageView设置FIT-CENTER属性导致的,可是设置后还是存在这个问题。

      懵逼了一会儿,仔细想了想原因。大概是因为photoView 初始化的时候测量的图片宽高出问题了,那么是什么原因导致的呢?找来找去,最终发现是因为占位图的大小和网络下载的图片大小不一致。因为下载图片是需要一定时间间隔的,由于在网络图片尚未下载完成时,就已经初始化了PhotoViewAttacher并测量了图片宽高,然而当加载图片完成后,PhotoView显示出来的是网络下载的图片,但初始化时就已经测量出的是占位图的宽高,所以图片缩放就存在问题。

      如果要下载的网络图片的宽高大小是固定的,则可设置一张同等大小的占位图,则解决了问题。但是一般情况下网络图片是不确定的,因此,这种做法不太合理。我们有两种处理方法(建议使用第二种方法):


第一种方法:如果对占位图的要求是可有可无的话,可以注释掉Glide占位图的设置。(在没有加载完网络图片的时候,Photoview是空图)。

复制代码
1
2
3
4
5
6
7
Glide.with(this) .load(url) /*.placeholder(R.mipmap.ic_default_man)*/ .diskCacheStrategy(DiskCacheStrategy.RESULT) .into(iv_photo);

XML布局文件中,PhotoView 的父控件需要是Relativelayout,如果使用的是Linerlayout,会导致测量的PhotoView宽高为 0

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
<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>


第二种方法通过给Glide设置下载进度监听,在网络图片下载完成之后,再初始化PhotoViewAttacher。


代码如下:


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 代码是这样的:

复制代码
1
2
3
4
ImageView mImageView = (ImageView) findViewById(R.id.iv_photo);

而在xml布局文件中,ImageView 是自定义的,所以应该改成:

复制代码
1
2
3
4
复制代码

PhotoView mImageView = (PhotoView) findViewById(R.id.iv_photo);
 


最后

以上就是迷人毛巾最近收集整理的关于Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新)的全部内容,更多相关Glide配合PhotoView使用时内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部