Android屏幕分辨率各种各样,碎片化严重,开发者苦不堪言,转身看看iOS开发同学,只要适配2个尺寸的屏幕就好了,= =!
但我们总是能克服的对不,假如我们现在有这么一个需求:
我们将满屏显示一张网络图片,希望它不要失真或者被裁剪!
怎么做?先看看友盟的统计:
排名 | 分辨率 | 高宽比 | 占有率 |
1 | 800*480 | 1.66 | 37.7% |
2 | 480*320 | 1.5 | 25.4% |
3 | 854*480 | 1.779 | 9.5% |
4 | 1280*720 | 1.777 | 5.6% |
5 | 960*540 | 1.777 | 5.6% |
6 | 320*240 | 1.333 | 3.1% |
7 | 1280*800 | 1.6 | 2.5% |
8 | 1024*600 | 1.706 | 1.3% |
9 | 960*640 | 1.5 | 0.9% |
10 | 1024*768 | 1.3 | 0.5% |
11 | other | ? | 4.7% |
让我们合并下高宽比约等项,再排名:
排名 | 高宽比 | 占有率 |
1 | 1.6~1.66 | 2.5%+37.7%=40.2% |
2 | 1.5 | 25.4%+0.9%=26.3% |
3 | 1.706~1.779 | 1.3%+8.8%+5.6%+9.5%=25.2% |
4 | 1.3~1.333 | 0.5%~3.1%=3.6% |
5 | ? | 4.7% |
可以看出前三项占了91%!!!,况且1.333的屏幕是320*240这种小屏幕,好古董的屏幕,而且未知项中可能还包含前三项中的可能,所以如果我们忽略一些细节的话,最终情况是这样的:
排名 | 分辨率 | 高宽比 | 占有率 |
1 | 800*480 | 1.66 | 40.2% |
2 | 480*320 | 1.5 | 26.3% |
3 | 1280*720 | 1.777 | 25.2% |
有什么用呢?
结论:假如这张网络请求下来的图片是设计师给出的,就请设计师对应着表3给出3套图,程序中我们动态算出手机屏幕的高宽比,根据高宽比对应选出最合适的图片,将scaleType设置为fitXY,这样就能做到最大程度的不失真了。
给一个写好的枚举类
enum AspectRatio {
SCALE_15, SCALE_166, SCALE_177;
public static AspectRatio getAspectRatio(float h2w) {
if (h2w <= 1.5f) {
return AspectRatio.SCALE_15;
} else if (h2w > 1.5 && h2w <= 1.67) {
return AspectRatio.SCALE_166;
} else if (h2w > 1.67) {
return AspectRatio.SCALE_177;
} else {
return AspectRatio.SCALE_166;
}
}
}