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

      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>


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


代码如下:


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);
 


你可能感兴趣的:(android,photoview,PhotoView+Gilde)