framework资源加载
主要参考链接:
http://blog.csdn.net/benw1988/article/details/6871244
http://hualang.iteye.com/blog/1304054
http://blog.csdn.net/kangyaping/article/details/7369145
http://dyingbleed.iteye.com/blog/1232723
移动平台对移动设备屏幕尺寸和分辨率多样化的支持
—Android平台 && IOS平台
1. 几个概念:
屏幕尺寸:手机的屏幕尺寸就是手机外形的物理大小,即屏幕的对角线测量。
像素:原本的定义是——基本原色素及其灰度的基本编码,在计算机领域,通常将其抽象为一个点。
分辨率:是指显示器所能显示的像素的多少,具体是指单位长度内包含的像素点的数量,单位通常为ppi。
屏幕密度:设备单位尺寸里所包含的像素数目,单位为dpi,即每英寸的像素点数。
- Android平台的兼容
2.1 Android平台设备的分类
Android将设备按屏幕尺寸分为四类:xlarge(960dp720dp),large(640dp480dp),normal(470dp320dp),small(426dp320dp)
Android将设备按屏幕密度分为四类:xhdpi(320dpi),hdpi(240dpi),mdpi(160dpi),ldpi(120dpi)
2.2 Android平台的独立像素概念
独立像素,也即密度无关像素(dip——density-independent pixel),以dp为单位,是一个虚拟的像素单元,供开发者来定义UI的布局,表达布局的尺寸或者位置。
系统默认mdpi为基准,即相当于一个160dpi的屏幕,则可通过公式dip/pixel = dpi/160来计算dip的值。
2.3 Android平台实现独立密度的方法
Android平台有两种方法实现独立密度:
使用dp作为UI布局控件位置的单位,通过公式计算得到符合当前屏幕密度的像素值;
缩放位图到合适的大小,来符合当前的屏幕密度。开发者提供不同分辨率的位图,以避免图片被过度放大而显得模糊。
2.4 Android实现支持多屏幕尺寸的具体方法
在manifest中明确的指出你的应用所支持的屏幕。只有屏幕尺寸相适应的设备才能下载,或者屏幕兼容模式的设备下载,再适应。
对不同的屏幕尺寸提供不同的layout,采用<layout-标签>作为文件夹名称,例如layout-xlarge/。在android3.2平台以上,提供swdp格式,来表示所需的最小的硬件配置,比如layout-sw600dp/。
在drawable中提供不同分辨率的位图(.png,.jpg,.gif,.9.png),使用<drawable-标签>形式作为文件夹名称,例如drawable-hdpi
2.5 Android系统在运行时对多屏幕尺寸的支持机制
系统首先在备选资源里寻找合适的资源,即,比如是高密度屏幕,则通过drawable-hdpi去寻找资源;
如果不能通过上述方法找到资源,则说明系统并没有分类提供这些合适的资源,因而,需要将默认路径的资源图片(存放在drawable中)进行缩放,来适应当前的屏幕密度。
位图的缩放比例为:3:4:6:8,依次对应低、中、高、超高。
2.6 Android系统选择最佳适配资源的实现
Android对一个资源的加载是framework中一系列函数的调用链
最后决定系统加载哪个文件是由Resources.getValue(int id,TypeValue
outValue,boolean resolveRefs)调用完成之后的outValue.string决定的。
AssetManager.loadResourceValue()调的是android_util_AssetManager.cpp里面的native方法,native方法通过以下几种途径获取outValue值:
a) 调用ResourceTypes.cpp 的ResTable::getResource(),遍历所有资源文件
b) 在ResTable::getResource()里面调用ResTable::getEntry()来确定资源文件来自哪个entry
c) 在ResTable::getEntry()里面:
i. 首先获取本设备的configurion信息
ii. 根据得到的本设备的configurion信息,过滤掉不适应本设备的entry
iii. 对过滤后的resource进行最佳适配,找到最符合的entry文件。实现在ResourceTypes.h中ResTable_config的isBetterThan()函数中。
[http://www.cnblogs.com/melaniedeng/archive/2012/05/17/2506869.html]
2.7 Android系统屏幕的兼容模式
Version1(android1.6–3.1):
在当前设备中,系统按照正常的手机屏幕尺寸大小(320dp*480dp)来绘制layout,其余空出来的屏幕的部分,则以黑色边界填充。这种方法目前已不经常使用。
Version2(android3.2及以上):
在当前设备中,系统按照正常的手机屏幕尺寸大小(320dp*480dp)来绘制layout,然后将其放大至可以填充整个设备的屏幕。这种方法,自然会引起图片的模糊。可以用户自己进行设置,或者开发人员设置在当前应用中禁止关闭兼容模式。
2.8 Android屏幕兼容模式的启动与关闭方法
启动屏幕兼容模式的两种方法:
a) 在manifest文件中设置
这表示,你的应用程序的最小屏幕宽度的上限为320,因此,当任何设备最小边的长度大于320时,则屏幕兼容模式便作为用户选项的一部分。
b) 当应用程序在为大屏幕重新绘图的时候产生功能障碍,但是,你又想让用户使用屏幕兼容模式,因此,你可以使用<supports-screens android:largestWidthLimitDp=”320”/>,
这里不允许用户关闭兼容模式。
关闭屏幕兼容模式的两种方法:
a) 通过manifest文件设置,这个和的值无关。
b) 将中androidtargetSdkVersion的值设为11或更高,表示支持大屏
- IOS平台的兼容
3.1 历代iPhone配置概况
iPhone:3.5英寸屏幕,480320像素,11561*11.6mm
iPhone 3G:3.5英寸屏幕,480320像素,115.562.1*12.3mm
iPhone 3GS:3.5英寸屏幕,480320像素,115.562.1*12.3mm
iPhone4:3.5英寸屏幕,960640像素,115.258.6*9.3mm
iPhone4S: 3.5英寸屏幕,960640像素,115.258.6*9.3mm
iPhone5:4英寸屏幕,1136640像素,123.858.6*7.6mm
3.2 分辨率兼容性问题
相较于搭载Android系统手机的多样性,搭载iOS平台的iPhone在分辨率上遇到的问题较少,主要集中在:
高分辨率显示屏的应用:视网膜(Retina)显示技术
屏幕尺寸的改变:3.5英寸(1.5:1)→4英寸(1.775:1)
3.3 高分辨率
视网膜(Retina)屏幕是苹果公司在部分移动产品上使用的一种显示技术。
第一次被人们熟知,是苹果将其用在iphone 4手机上,它将960×640的分辨率压缩到一个3.5英寸的显示屏内。
也就是说,该屏幕的像素密度达到326像素/英寸(ppi),称之为“视网膜屏幕”。
通常电脑显示屏幕的分辨率为72ppi,iPhone 4的分辨率为电脑的4倍多。由于其具备超高像素密度的液晶屏,因此屏幕显示异常清晰、锐利。
3.4 高分辨率兼容问题
低分辨率的程序在高分辨率的终端上运行会怎样?
图片、文字方面可能显示不清晰,产生如锯齿等效果。
程序整体布局方面,可能产生拉伸变形、不能全屏显示等问题。
应用程序和软件产品通常会在这样的终端变得面目全非。
而这显然给用户的使用带来了严重的问题,直接导致的问题如:操作易用性Usability、功能可接近性Accessibility、文本可读性Readability 等。
为了提高用户体验,2012年,苹果要求任何需要提交更新或全新上架的应用的开发者,提交支持视网膜显示屏分辨率的应用截图,也就是说,截图像素需要大于或等于960*480像素。
屏幕尺寸改变的问题,主要针对于iPhone 5。
众所周知,iPhone 5一改数代iPhone 3.5英寸的屏幕尺寸,变为4英寸,这使得很大一部分app应用,无法对其进行完美支持。
Phone 5的分辨率相较以前有了十分大的改变——iPhone 5的分辨率为1136640像素,和iPhone 4/4S的960640相比,纵向多了176个像素。
旧版的iOS App都是基于960*640的分辨率开发,而多出来的176像素会让旧版App运行在iPhone 5时,出现拉伸、黑边等不完美的现象。
苹果在日前发布公告称从5月1日开始所有APP Store中的iPhone上的应用必须能够支持iPhone 5,否则将会做下架处理。
3.5 解决方案
要让应用程序在高分辨率和不同尺寸的屏幕下,显示仍然保持正常可视,重点需要解决四个方面的问题:
文本和字体
图像(图形、图标和鼠标指针)
版面设置
重绘
文本、字体和图像的调整?
文本和图像如果本身分辨率较低,则缩放之后很可能失真。
为了适应更高的分辨率,需要对程序自身的文字、图片等要素进行调整。
版面设置的调整?
面对不同分辨率的屏幕:
如果使用绝对布局,则在较低分辨率的终端上运行很可能界面显示不完全,或者程序崩溃;而在较高分辨率的终端上,可能界面只能占据屏幕的一部分,而不能获得很好的用户体验。
如果使用相对布局,则界面可能由于拉伸而产生变形。比如iPhone4 app的布局应用到iPhone5上。
为了解决这个问题,可以参考使用iOS的自动布局方式,或者开发几套不同的布局,识别硬件设备后自动进行匹配使用。
4. 总结
未来显示技术发展方向:
超级屏方向:超高ppi,超清显示。
高分辨率方向:超高分辨率,更丰富的内容显示。
3D方向:立体化显示,效果更逼真。
软性显示:屏幕软性化,可弯曲显示适用特种场合。
目前来看,随着移动设备(智能手机、平板电脑等)的爆炸式发展,超极屏是近几年重点发展的显示技术。
因此,手机平台的程序研发需要注重多分辨率,尤其是对高分辨率的支持,以提高用户体验,获得更好的评价和经济效益。
日记本
相关推荐
21道Android高级面试题,面试官都被搞愣了
阅读 4312
准备报考MBA?不能错过的MBA公开课!
广告
Activity 的 36 大难点,你会几个?「建议收藏」
阅读 3048
Android性能优化来龙去脉总结
阅读 1743
腾讯Android社招面试源码相关11题+原理详解
阅读 1443