现在电视一般都是1080p,手机大部分也是1080p,但是电视动不动就是42”,手机也就5英寸,但是电视为什么还是这么清晰呢?
昨天就这个问题去找答案,结果最后扯到了Android的适配上,本来吧我觉得自己开发Android这么久了,适配什么的早已不是问题,但是图样图森破啊,还是太年轻。
目录(已经掌握的部分可以跳过):
基础知识(dp,px,dpi,sp,dip)
Android碎片化
不同碎片化问题的解决方案
(一)基础知识
inch 英寸,1inch = 2.54cm
px,像素,1080p后面的这个p就是它了,1920*1080是指这块屏幕上一共有这么多个像素,长边有1920个,短边有1080个像素。
dpi,即dot per inch,指一inch上的像素数量。
dip,设备独立像素,以160dpi为基准,在160dpi的设备上,1dip = 1px;同理,320dip的设备,1dip = 2px。不管什么分辨率的设备,1dip = 1(inch)/160。
dp,同dip
(二)Android碎片化
Android由于其开源的特性,导致碎片化问题严重,其碎片化包括系统碎片化,分辨率碎片化,尺寸碎片化,传感器碎片化,处理器碎片化。我们做适配最多的就是分辨率碎片化和尺寸碎片化,本文主要讲解的也是这两种。
sp,其大小计算同dp,与dp的差别在于它会受系统字体大小设置的影响。
(三)解决方案
分辨率碎片化
a.使用相对布局,不用绝对布局,使用 wrap_content,match_parent
b.使用布局别名,布局别名的使用有两种方式,下面详细说明:
第一种:直接新建不同的layout文件夹,layout-mdpi,layout-land等等,然后再里面分别放上对应的布局文件。
第二种:将所有的布局文件都放到layout文件夹中,然后新建不同的values文件夹来引用这些布局文件,比如values,values-sw720dp等等。
推荐用第二种方式,这种方式还可以对dimens,styles等做适配
c.给不同分辨率的图片,现在1080p和720p的比较多。所以一般给出mdpi,hdpi,xhdpi,xxhdpi。
其对应的分辨率如下:
尺寸 | dpi | 倍数 | 给1920*1080 |
---|---|---|---|
ldpi | 120-160 | 1x | |
ldpi | 160-240 | 1.5x | |
lhdpi | 240-320 | 2x | 0.17 |
mdpi | 320-480 | 3x | 0.25 |
hdpi | 480-800 | 5x | 0.42 |
xhdpi | 720-1280 | 8x | 0.67 |
xxhdpi | 1080-1920 | 12x | 1 |
xxxhdpi | 2160-3840 | 24x | 2 |
d.合理使用.9图,对于边角不那么多的图片可以用.9图来保证拉伸效果。
e.上面说的方法属于比较常规的适配方案,下面着重说一下尺寸碎片化的处理。Nexus 5是1980*1080,屏幕尺寸是5.0;Nexus 5X分辨率也是1980 * 1080,但是尺寸是5.2。这种情况对于手机来说差别可能不是很大,不是对效果特别追求的话可以忽略,但是对于平板和电视来说尺寸差异就很大了,此时如果再按照分辨率适配的方案来处理,轻则样式错误,重则由于资源问题导致OOM等问题。
对于这种,应该使用尺寸限定符,比如layout-sw320dp,values-sw320dp,意思是设备的最窄边大于等于320dp的时候会使用对应的布局和资源
f.Android官方之前放出了了一个百分比布局的support包,这个包在
AndroidSDK\extras\android\support\percent
这个目录下,布局可以使用百分比来确定位置,谷歌在适配上走了一大进步啊。
g.讲到这里,顺便把国际化命名对应表放在这里,免得用的时候到处找:
用的时候这样:values-ar-rEG , drawable-ar-rEG-hdpi
Arabic, Egypt (ar_rEG) —————————–阿拉伯语,埃及
Arabic, Israel (ar_rIL) ——————————-阿拉伯语,以色列
Bulgarian, Bulgaria (bg_rBG) ———————保加利亚语,保加利亚
Catalan, Spain (ca_rES) —————————加泰隆语,西班牙
Czech, Czech Republic (cs_rCZ) —————–捷克语,捷克共和国
Danish, Denmark(da_rDK) ————————丹麦语,丹麦
German, Austria (de_rAT) ————————-德语,奥地利
German, Switzerland (de_rCH) ——————-德语,瑞士
German, Germany (de_rDE) ———————-德语,德国
German, Liechtenstein (de_rLI) ——————德语,列支敦士登的
Greek, Greece (el_rGR) —————————-希腊语,希腊
English, Australia (en_rAU) ————————-英语,澳大利亚
English, Canada (en_rCA) ————————–英语,加拿大
English, Britain (en_rGB) —————————-英语,英国
English, Ireland (en_rIE) —————————–英语,爱尔兰
English, India (en_rIN) ——————————–英语,印度
English, New Zealand (en_rNZ) ———————英语,新西兰
English, Singapore(en_rSG) ————————–英语,新加坡
English, US (en_rUS) ———————————–英语,美国
English, Zimbabwe (en_rZA) ————————–英语,津巴布韦
Spanish (es_rES) —————————————-西班牙
Spanish, US (es_rUS) ———————————–西班牙语,美国
Finnish, Finland (fi_rFI) ———————————芬兰语,芬兰
French, Belgium (fr_rBE) ——————————-法语,比利时
French, Canada (fr_rCA) ——————————-法语,加拿大
French, Switzerland (fr_rCH) ————————–法语,瑞士
French, France (fr_rFR) ——————————–法语,法国
Hebrew, Israel (he_rIL) ———————————希伯来语,以色列
Hindi, India (hi_rIN) ————————————-印地语,印度
Croatian, Croatia (hr_rHR) —————————-克罗地亚语,克罗地亚
Hungarian, Hungary (hu_rHU) ————————匈牙利语,匈牙利
Indonesian, Indonesia (id_rID) ————————印尼语,印尼
Italian, Switzerland (it_rCH) —————————-意大利语,瑞士
Italian, Italy (it_rIT) —————————————意大利语,意大利
Japanese (ja_rJP) —————————————-日语
Korean (ko_rKR) ——————————————朝鲜语
Lithuanian, Lithuania (lt_rLT) ————————–立陶宛语,立陶宛
Latvian, Latvia (lv_rLV) ———————————拉托维亚语,拉托维亚
Norwegian-Bokmol, Norway(nb_rNO) —————挪威语,挪威
Dutch, Belgium (nl_rBE) ——————————–荷兰语,比利时
Dutch, Netherlands (nl_rNL) —————————荷兰语,荷兰
Polish (pl_rPL) ——————————————-波兰
Portuguese, Brazil (pt_rBR) —————————葡萄牙语,巴西
Portuguese, Portugal (pt_rPT) ————————葡萄牙语,葡萄牙
Romanian, Romania (ro_rRO) ————————罗马尼亚语,罗马尼亚
Russian (ru_rRU) —————————————-俄语
Slovak, Slovakia (sk_rSK) ——————————斯洛伐克语,斯洛伐克
Slovenian, Slovenia (sl_rSI) —————————-斯洛文尼亚语,斯洛文尼亚
Serbian (sr_rRS) —————————————-塞尔维亚语
Swedish, Sweden (sv_rSE) —————————-瑞典语,瑞典
Thai, Thailand (th_rTH) ——————————–泰语,泰国
Tagalog, Philippines (tl_rPH) ————————–菲律宾语,菲律宾
Turkish, Turkey (tr_rTR) ——————————-土耳其语,土耳其
Ukrainian, Ukraine (uk_rUA) ————————–联合王国
Vietnamese, Vietnam (vi_rVN) ———————–越南语,越南
Chinese, PRC (zh_rCN)——————————–中文,中国
Chinese, Taiwan (zh_rTW)—————————–中文,台湾
附录:启动图标
L DPI ( Low Density Screen,120 DPI ),其图标大小为 36 x 36 px
M DPI ( Medium Density Screen, 160 DPI ),其图标大小为 48 x 48 px
H DPI ( High Density Screen, 240 DPI ),其图标大小为 72 x 72 px
XH DPI ( Extra-high density screen, 320 DPI ),其图标大小为 96 x 96 px
XXH DPI( xx-high density screen, 480 DPI ),其图标大小为144 x 144 px
XXXH DPI( xxx-high density screen, 640 DPI ),其图标大小为192 x 192 px
最后回答开头提出的问题,是因为电视上每一个像素很大,比手机上的一个像素大得多,所以电视虽然那么大,它也是1080p的。因为一个像素很大,所以你不能凑上去看,不然会看到马赛克哦。