现在电视一般都是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 pxM DPI ( Medium Density Screen, 160 DPI ),其图标大小为 48 x 48 pxH DPI ( High Density Screen, 240 DPI ),其图标大小为 72 x 72 pxXH DPI ( Extra-high density screen, 320 DPI ),其图标大小为 96 x 96 pxXXH DPI( xx-high density screen, 480 DPI ),其图标大小为144 x 144 pxXXXH DPI( xxx-high density screen, 640 DPI ),其图标大小为192 x 192 px

最后回答开头提出的问题,是因为电视上每一个像素很大,比手机上的一个像素大得多,所以电视虽然那么大,它也是1080p的。因为一个像素很大,所以你不能凑上去看,不然会看到马赛克哦。

更多相关文章

  1. 小猪浅谈Android屏幕适配
  2. Android(安卓)activity简单的跳转
  3. android适配各种分辨率的问题
  4. [置顶] (android高仿系列)今日头条 --新闻阅读器 (二)
  5. Android(安卓)Recycleview的侧滑删除加上拉加载下拉刷新
  6. 【Android】UI设计之界面布局
  7. Android(安卓)适配横屏
  8. 转贴 Android(安卓)开发之旅:view的几种布局方式及实践
  9. 【Android(安卓)开发教程】FrameLayout帧布局

随机推荐

  1. android 语言切换过程分析
  2. 1.4 android——UI之 UI界面属性用法与注
  3. android 网络开发
  4. Android(安卓)sqlite cursor的遍历
  5. Android Scroll 分析
  6. Android:Android SDK Manager
  7. Android布局属性解析
  8. Android--应用开发3(Android layout XML属
  9. 搭建Android + Eclipse环境时遇到的问题
  10. PackageManagerService(Android5.1)深入