您的位置:首页 > 其它

Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新)

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

      懵逼了一会儿,仔细想了想原因。大概是因为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);
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐