基于Android平台的多分辨率解决方案目前基于Android系统的机型越来越多,一些硬件指标出现了混乱的局面,其中最明显的就是屏幕分辨率的问题。如何使应用程序尽可能多地适应多种分辨率,如何在开发程序时兼容不同平台不同屏幕,已成为开发者最为关注的问题点之一。1引言如今的智能手机用户对应用软件的舒适性和美观性有了更大的期望,应用程序界面友好性已经越来越重要。但是由于Android的开源性,硬件厂商屏幕分辨率不统一,据统计目前市场上Android系统手机的分辨率有10余种,分辨率分布如此广泛使得开发者在处理多分辨率适应方面遇到了不少难题。开发者在处理多分辨率时应采用怎样的方法,才能兼容同分辨率呢?2Android平台简介Android是一个包括操作系统、中间件和关键应用的移动设备软件堆,Android系统和其他系统一样,采用分层的架构。由下至上依此为Linux操作系统和驱动、程序库及Android运行时环境、应用程序框架层、应用层。Android应用程序的基本组件有Activity、Intent、BroadcastReceiver、Service四种,各个组件的配置信息以及权限管理、版本管理等配置信息都保存在AndroidManifest.xml中。3Android应用程序资源管理手机界面上加载的图片是Android资源的一种,除此之外还有XML资源(anim.xmllayout.xml等)以及原数据文件。新建一个HelloAndroid的Android应用程序,默认生成的文件架构包含src,gen,assets,res等文件夹,以及AndroidManifest.xml配置文件。src文件夹中保存的是Android源代码,res文件夹代表应用程序需要使用到的资源文件,gen包中包含R.java文件。Res文件夹中包含的所有资源文件都对应在R.java中。在res/目录中任何一个子目录中添加相应类型的文件之后,ADT会在R.java文件中相应的匿名内部类中国自动生成一条静态int类型的常量,对添加的文件进行索引。Android系统采取这种架构使视图等资源文件与控制代码分离,实现松耦合。然而可以使用R.java文件在代码中对相应的资源文件进行存取,灵活操作。如图:不同的layoutAndroid手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢?其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。hdpi、mdpi、ldpi在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。drawable-hdpi、drawable-mdpi、drawable-ldpi的区别:(1)drawable-hdpi里面存放高分辨率的图片,如WVGA(480x800),FWVGA(480x854)(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA(320x480)(3)drawable-ldpi里面存放低分辨率的图片,如QVGA(240x320)低密度(120),ldpi中密度(160),mdpi高密度(240),hdpi小屏幕QVGA(240×320),2.6~3.0寸普通屏幕WQVGA(240×400),3.2~3.5寸FWQVG(240×432),3.5~3.8寸HVGA(320×480),3.0~3.5寸WVGA(480×800),3.3~4.0寸FWVGA(480×854),3.5~4.0寸大屏WVGA(480×800),幕4.8~5.5寸FWVGA(480×854),5.0~5.8寸系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。注:在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。横屏竖屏每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation=landscape。例如(landscape是横向,portrait是纵向)。4Android多分辨率设备兼容性问题解决方案基本思路首先应当明确应用希望支持几种分辨率设备;其次,需明确哪些资源文件在不同分辨率的设备存在显示问题;对于显示有问题的,需要重新准备与相应分辨率设备适配的资源文件和页面布局文件一般多分辨率处理方法及其缺点1)图片缩放基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。Android平台中,当程序在manifest中设置android:anyDensity=true后,系统会对创建的bitmap进行缩放,缩放的根据就是Density。2)自动定义像素尺寸和位置如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA高精度屏幕和传统的HVGA屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320×480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。3)兼容更大尺寸的屏幕当前屏幕超过程序所支持屏幕的上限时,定义supports-screens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480的,多余的显示区域会被填充成黑色。4)采用OpenGL动态绘制图片Android底层提供了OpenGL的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计算机图形学的开发者来讲是一个很大的挑战。一般开发游戏,采用OpenGL方式。5)多个apk文件Symbian和传统的J2ME就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前GoogleMarket对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk文件适应多个分辨率。5相关术语屏幕尺寸真正的物理尺寸(屏幕对角线的长度,单位是英寸,如2.8寸,3.5寸)。为了简化起见,Android把支持的所有物理尺寸分成了4组:small,normal,large,extralarge。屏幕长宽比屏幕的物理长度与物理宽度的比例。程序可以为制定长宽比的屏幕提供制定的素材,只需要用系统提供的资源分类符long和notlong。屏幕密度Density一定物理范围的像素的个数,单位通常是dpi(dotsperinch),即每英寸的点数。例如一个低分辨率屏幕相对于高分辨率屏幕在一定的物理区域内包含的像素点要少。为了简化起见,Android将所有的屏幕密度分成四组:low,medium,high和extrahigh。简单的说,就是以屏幕分辨率为基础,沿屏幕长宽方向排列的像素。密度较低的屏幕,在长和宽方向都只有比较少的像素,而高密度的屏幕通常则会有很多——甚至会非常非常多——像素排列在同一区域。屏幕的密度是非常重要的,举个例子,长宽以像素为单位定义的界面元素(比如一个按钮),在低密度的屏幕上会显得很大,但在高密度的屏幕上则会显得很小。图表形式:术语说明备注Screensize(屏幕尺寸)指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸摩托罗拉milestone手机是3.7英寸AspectRatio(宽高比率)指的是实际的物理尺寸宽高比率,分为long和nolongMilestone是16:9,属于longResolution(分辨率)和电脑的分辨率概念一样,指手机屏幕纵、横方向像素个数Milestone是854*480DPI(dotperinch)每英寸像素数,如120dpi,160dpi等,假设QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),dpi=160可以反映屏幕的清晰度,用于缩放UI的Density(密度)屏幕里像素值浓度,resolution/Screensize可以反映出手机密度Density-independentpixel(dip)指的是逻辑密度计算单位,dip和具体像素值的对应公式是dip/pixel=dpi值/160方向Orientation从用户视角来看的屏幕的方向,Portrait纵向和Landscape横向。分辨率Resolution屏幕上所有的像素点数目,一般用480*800的形式来表示。密度无关像素dp:Android平台中虚拟的像素单位,定义成一种密度无关的形式,像素px和dp的转换公式为px=dp*(dpi/160)。在界面开发中应使用dp作为像素单位,从而保证在不同的屏幕密度上控件所占的实际px因密度而自动调整。6设计指南Androidicon图标设计,主要针对UI、美工等设计人员。LauncherIcon是程序主界面上的功能图标,Android对于各个icon的风格有一定的要求:符合当下的流行趋势,避免过度使用隐喻。高度简化和夸张,小尺寸图标也能易于识别,不宜太复杂。尝试抓住程序的主要特征,比如音像作为音乐的icon。使用自然的轮廓和形状,看起来几何化和有机化,不失真实感。Icon采用前视角,几乎没有透视,光源在顶部。不光滑但富有质感。正确和错误的icon另外,所有的icon都有文字标签,不要在设计时把文字也放到icon中。LauncherIcon通常是一个较大的标准图标中包含一个小图标,使用一个中性色彩和一个主要色彩,并保持高度的对比,不宜过度饱和。推荐色值尺寸和定位Launchericons要有多样化的形状和样式,但又要形成统一的视觉风格,其尺寸和定位也用统一:(FullAsset)红色边框为图标尺寸(Icon)蓝色边框是图形尺寸,比图标尺寸稍小,图形之外的空间用于显示阴影和特殊效果。(SquareIcon)橙色边框是另外一种图形尺寸。两种类型的图形尺寸可以达到统一的视觉权重。Icondimensionsforhigh-density(hdpi)screens:FullAsset:72x72pxIcon:60x60pxSquareIcon:56x56pxIconDimensionsformedium-density(mdpi)screens:FullAsset:48x48pxIcon:40x40pxSquareIcon:38x3IconDimensionsforlow-density(ldpi)screens:FullAsset:36x36pxIcon:30x30pxSquareIcon:28x28px图片资源:模板下载Android的标准图标模板,在此基础上绘制icon,后期还要加上阴影效果。WVGA(高精度)屏幕的阴影:Effect:DropShadowColor:#000000BlendMode:MultiplyOpacity:75%Angle:90°Distance:2pxSpread:0%Size:5px程序ic