加载本地图片模糊,Glide加载网络图片却很清晰

问题

前几天做项目,同事遇到个问题,加载drawable中图片很模糊,用Glide加载就清晰,其中图片放在xhdpi文件夹中,屏幕分辨率是1280x720,奇怪的是xhdpi的图片对应的就是1280x720的分辨率,为什么会不清晰呢?我后来写了个demo验证了下,发现确实会不清晰,如下:

加载本地drawable不清晰

最后一个glide加载清晰
首先是想起以前看过的文章Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手看完这两篇文章应该就能理解为什么图片会模糊,简单说就是像放在drawable-mdpi、hdpi、xhdpi、xxhdpi中的图片分别是对应不同分辨率屏幕的,假如我只在xxhdpi放一张图片,在较低分辨率的屏幕上会压缩,如果在mdpi中放一张图片,在高分辨率屏幕上就会放大,计算公式如下:

资源图片最终大小 = 宽 x(设备密度 / 资源维度密度)x 高(设备密度 / 资源维度密度) x 4

设备密度是说不同分辨率的屏幕对应的密度,资源维度密度是说drawable-mdpi、hdpi、xhdpi、xxhdpi这些分别也对应不同的密度,具体见下表

文件夹 资源维度密度 对应分辨率 设备密度
drawable-mdpi 160 320x480 160
drawable-hdpi 240 480x800 240
drawable-xhdpi 320 720x1280 320
drawable-xxhdpi 480 1080x1920 480
drawable-xxxdpi 640 1440*2560 560

其中资源维度密度是系统规定好的,因为屏幕分辨率和屏幕尺寸不同,设备密度这个值可以用 getResources().getDisplayMetrics().densityDpi查看,我测试的电视打印出来的设备密度是240,很奇怪的不是320,后来在这篇文章android 手机屏幕密度等级和屏幕逻辑尺寸才知道这个值是厂商定义的,所以同分辨率不同屏幕尺寸的设备密度会有不同,开始时并不知道这一点,只是认为放在xhdpi文件夹中就应该是对应的1280x720分辨率的屏幕,就不应该会被压缩。

解答

回到我们刚才的问题,图片尺寸是411x195,使用本地图片和glide加载内存占用分别是179871和320580

根据公式: 资源图片最终大小 = 宽 x(设备密度 / 资源维度密度)x 高(设备密度 / 资源维度密度) x 4

用glide加载可以不被压缩,所以内存占用=411x195x4=320580,和打印值相等。计算本地加载时宽=411x240/320=308.25取整308,高195x240/320=146.25取整146,308x146x4=179872,和打印出来的相等。到这问题也算是解决了,开始是因为不知道屏幕密度是由厂商规定的,并不是由屏幕分辨率规定的,所以就算把图片放到的分辨率对应的drawable中还是有可能会被压缩。

总结

我们Android里面的长度单位推荐用dp,表示和设备无关的一个单位,用来在不同分辨率上看起来效果一样,或者说在相同分辨率不同屏幕尺寸下看起来效果不一致。dp以160为1,表示在160密度的屏幕上1dp表示1px,那么在320的屏幕上1dp表示2px,在640的屏幕上1dp表示4px,以此类推。 假定有两块5寸屏幕,一块1280x720分辨率,一块1920x1080,现在上面放一个80dpx80dp的图片,这个图片在1280的屏幕上最终显示160pxx160px,在1920上显示240pxx240px, 这样160/720=0.222,240/1080=0.222,这样图片在屏幕所占比例一样,即在低分辨率上能放几个按钮,在高分辨率上也是放几个按钮,位置大小看起来都一样。

但是一般的同分辨率下电视屏幕都要比手机屏幕大,手机一排放两个按钮可能就差不多了,但是电视上如果只放两个按钮就会显得按钮很大,很不协调,电视可能能放下四个甚至更多按钮,这相当于是屏幕越大应该显示的东西越多。所以这才有了厂商自定义的设备密度,比如同样1920x1080分辨率,手机的设备密度是480,电视的设备密度可能只有240(我测试的一款电视只有213),根据公式:

资源图片最终大小 = 宽 x(设备密度 / 资源维度密度)x 高(设备密度 / 资源维度密度) x 4 100dpx20dp的按钮在手机上实际300pxX60px,但在电视上只有150pxX30px,在1080手机上一排最多只能放3个了,但在电视上就可以1080/150=7个(先不考虑电视的横竖屏), 当然实际不可能会放7个这么多。手机上一个宽度占屏幕宽度三分之一的按钮看起来效果是比较好的,但是如果占了电视屏幕宽度三分之一看起来就不那么优雅了。

思考

上面讨论的是手机和电视这样相比屏幕尺寸差别很大的,但是只针对电视,不同厂商不同尺寸电视(40寸,55寸,65寸这样的尺寸),设备密度差别也很大,比如我测试的两个电视都是1280x720的,但是一个密度是213,一个是240,但是具体屏幕尺寸都是一样的21寸,如果我们继续使用dp,sp这样的单位根据上面的公式可知:实际宽=宽x设备密度/资源维度密度,导致宽高在设备密度为213的上面的会比240上面的小,所以最终采用的是px单位,以1280x720为标准,在不同分辨率屏幕上计算实际的像素值,比如以1280x720为模板设计的图片尺寸是100x100,那么在1920x1080上面就是150x150大小,这样就能比较完美适应不同屏幕了

发布了166 篇原创文章 · 获赞 40 · 访问量 22万+
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览