下午接到个任务,好信云会议在IM中浏览超大全景图片,横屏后浏览图片放大,图片严重失真问题。
效果图片
思路1
以为是加载的缩略图,屡一下代码,
GlideApp.with(ImageFragment.this).load(src).thumbnail(GlideApp.with(ImageFragment.this).load(animateUrl).onlyRetrieveFromCache(true).override(HxContants.OVERSIZE)).placeholder(R.drawable.cloud_ic_image_default).into(imgPhoto);
用了个thumbnail,没啥问题,但是要排除问题,所以把thumbnail去掉,变成了
GlideApp.with(ImageFragment.this).load(src).placeholder(R.drawable.cloud_ic_image_default).into(imgPhoto);
还是有问题,明明下载的是原图片,妈的
思路2
是不是svg的展示控件缩放的问题
查了一下svg的展示控件,NoteGraphView,继承自PhotoView,PhotoView继承自ImageView,但是其中有大量图片缩放的方法,为了确认是不是在图片缩放过程中出现了问题,将NoteGraphView直接替换为ImageVIew进行展示。
还tm有问题,那就不是NoteGraphView控件的问题。
思路3
是不是图片展示控件自动给放大缩小了,这顿查找Glide的相关方法,也没查出来个123,但是官方文档也说明了,系统会自动对BitMap进行放大缩小,降低内存,来进行显示
换控件,妈的
换ImageLoader,也那玩意。照样模糊,想哭。
思路4
既然不是控件和三方的问题,那就找找图片本身的问题,查看一下原图片啥样
下载个原图片看看,中间有个小插曲,用浏览器get方式请求图片地址请求不到,问了一下,需要用session,遂用postman,在header中添加了个cookie字段,就成功了,下载下来的图片这么大:
大小是9.29MB,我擦擦擦擦擦擦擦擦擦。
那就是大图片缩小的问题了
思路5
这个测试手机1920X1080,初始纵向查看的时候宽就变成了1080,高就变成了更低。直接缩小了15076/1080=14倍
切换横屏后能好一些,15076/1920=8倍,但是查找代码,横屏后不重新调用生命周期,图片不重新加载,那么横屏后用的图片,还是缩小14倍的图片
把AndroidManifest.xml中横屏后不重新加载生命周期的配置去掉
android:configChanges="screenSize|keyboardHidden|orientation"
去掉后效果好很多,如图:
但还是看不清,没有iPhone看的清楚,问了一下提出这个问题的ios开发人员,他的是iPhone8plus,分辨率是2208X1242,图片缩小的倍数,要比我这个小,而且iPhone的屏幕像素密度比锤子手机高很多,所以肯定比锤子手机显示的图片质量好。
为了验证我的想法,用我的S8Plus实验,分辨率是2960X1440,缩小15076/2960=5倍,效果肯定比iPhone要好,实际测试如图:
和我想得一样,这张图片的放大倍数要比上面测试机的倍数大,不论是‘严禁攀爬’四个字还是人物轮廓,都比上面的图片清楚多了。