概述
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);
最后
以上就是迷人毛巾为你收集整理的Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新)的全部内容,希望文章能够帮你解决Glide配合PhotoView使用时,图片放大缩小时宽高显示出问题解决记录(新更新)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复