Android适配解决方案

本文解析了1080p分辨率在不同尺寸屏幕上的清晰度表现,探讨了Android应用如何应对多种屏幕尺寸及分辨率的挑战,并提供了有效的适配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在电视一般都是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
ldpi120-1601x
ldpi160-2401.5x
lhdpi240-3202x0.17
mdpi320-4803x0.25
hdpi480-8005x0.42
xhdpi720-12808x0.67
xxhdpi1080-192012x1
xxxhdpi2160-384024x2

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的。因为一个像素很大,所以你不能凑上去看,不然会看到马赛克哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值