1、Android屏幕自适应Android屏幕自适应1、屏幕相关概念1.1分辨率是指屏幕上有横竖各有多少个像素1.2屏幕尺寸指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸。android将屏幕大小分为四个级别(small,normal,large,and extra large)。1.3屏幕密度 每英寸像素数。手机可以有相同的分辨率,但屏幕尺寸可以不相同,Diagonal pixel表示对角线的像素值(=),DPI=933/3.7=252android将实际的屏幕密度分为四个通用尺寸(low,medium,high,and extra high)。一般情况下的普
2、通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚1.4密度无关的像素(Density-independent pixeldip)dip是一种虚拟的像素单位。dip和具体像素值的对应公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160)。当你定义应用的布局的UI时应该使用dp单位,确保UI在不同的屏幕上正确显示。 目前主要是以分辨率为800*480和854*480的手机用户居多。从以上的屏幕尺寸分布情况上看,其实手机只要考虑3-4.5寸之间
3、密度为1和1.5的手机。2、android多屏幕支持机制Android的支持多屏幕机制即用为当前设备屏幕提供一种合适的方式来共同管理并解析应用资源。Android平台中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合适资源。指定大小(size-specific)的合适资源是指small, normal, large, and xlarge。指定密度(density-specific)的合适资源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)。Androi
4、d有个自动匹配机制去选择对应的布局和图片资源1)界面布局方面根据物理尺寸的大小准备5套布局:layout(放一些通用布局xml文件,比如界面顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局), layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)2)图片资源方面需要根据dpi值准备5套图片资源:drawable:主要放置xml配置文件或者对分辨率要求较低的图片drawalbe-ldpi:低分辨率的图片,如Q
5、VGA (240x320)drawable-mdpi:中等分辨率的图片,如HVGA (320x480)drawable-hdpi:高分辨率的图片,如WVGA (480x800),FWVGA (480x854)drawable-xhdpi:至少960dp x 720dpAndroid有个自动匹配机制去选择对应的布局和图片资源。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。3、AndroidManifest.xml 配置android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增
6、加了自动适配的功能3.1是否支持多种不同密度的屏幕android:anyDensity=true | false 如果android:anyDensity=true:指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。如果android:anyDensity=false:应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240320像素的手机,如果设置android:anyDensit
7、y=false,Android系统会将240 x 320(低密度)转换为 320480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。3.2是否支持大屏幕android:largeScreens=true | false如果在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统使用尺寸为(normal)和密度为(medium)显示,不过会出现一层黑色的背景。3.3是否支持小屏幕android:smallScreens=true | false如果在声明不支持的小屏幕,而当前屏幕尺寸是smaller的话,系统也使用尺寸为(normal)和密度为(medium)显示。如
8、果应用程序能在小屏幕上正确缩放(最低是small尺寸或最小宽度320dp),那就不需要用到本属性。否则,就应该为最小屏幕宽度标识符设置本属性来匹配应用程序所需的最小尺寸。4、Android提供3种方式处理屏幕自适应4.1预缩放的资源(基于尺寸和密度去寻找图片)1)如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。2)如果没法找到相应的尺寸,而找到密度,则认为该图片尺寸为 medium,利用缩放显示这个图片。3)如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 medium (160)。4.2自动缩放的像素尺寸和坐标(密度兼容)1)如果应用程序不支持不同密度android:an
9、yDensity=false,系统自动缩放图片尺寸和这个图片的坐标。2)对于预缩放的资源,当android:anyDensity=false,也不生效。3)android:anyDensity=false,只对密度兼容起作用,尺寸兼容没效果4.3兼容更大的屏幕和尺寸(尺寸兼容)1)对于你在声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为 (normal)和密度为(medium)显示。2)对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为(normal)和密度为(medium)显示,不过会出现一层黑色的背景。5、Android系统自动适配技巧An
10、droid系统采用下面两种方法来实现应用的自动适配:1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小2)为不同屏幕密度的手机,提供不同的位图资源,可以使得界面清晰无缩放。对应bitmap 资源来说,自动的缩放有时会造成放大缩小后的图像变得模糊不清,这是就需要应用为不同屏幕密度配置提供不同的资源:为高密度的屏幕提供高清晰度的图像等。3)不要使用AbsoluteLayout4)像素单位都使用DIP,文本单位使用SP6、在代码中获取屏幕像素、屏幕密度DisplayMetrics metric =
11、 new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);int width = metric.widthPixels; / 屏幕宽度(像素)int height = metric.heightPixels; / 屏幕高度(像素)float density = metric.density; / 屏幕密度(0.75 / 1.0 / 1.5)int densityDpi = metric.densityDpi; / 屏幕密度DPI(120 / 160 / 240)7、 一般多分辨率处理方法及其缺
12、点7.1 图片缩放基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi 中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。7.2 自动定义像素尺寸和位置如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160 的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA 高精度屏幕和传统的HVGA 屏幕一样显示同样尺寸的图片,当程序不支
13、持时,系统会对程序慌称屏幕分辨率为320480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。7.3 兼容更大尺寸的屏幕当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320480 的,多余的显示区域会被填充成黑色。7.4 采用OpenGL 动态绘制图片Android 底层提供了OpenGL 的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计算机图形学的开发者
14、来讲是一个很大的挑战。一般开发游戏,采用OpenGL 方式。7.5 多个apk 文件Symbian 和传统的J2ME 就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前Google Market 对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk 文件适应多个分辨率。以下是Demo首页的预览图一、细说layout_weight目前最为推荐的Android多屏幕自适应解决方案。该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中。其值越小,则对应的layout
15、_width或layout_height的优先级就越高,一般横向布局中,决定的是layout_width的优先级;纵向布局中,决定的是layout_height的优先级。传统的layout_weight使用方法是将当前控件的layout_width和layout_height都设置成fill_parent,这样就可以把控件的显示比例完全交给layout_weight;这样使用的话,就出现了layout_weight越小,显示比例越大的情况。不过对于2个控件还好,如果控件过多,且显示比例也不相同的时候,控制起来就比较麻烦了,毕竟反比不是那么好确定的。于是就有了现在最为流行的0px设值法。看似让人
16、难以理解的layout_height=0px的写法,结合layout_weight,却可以使控件成正比例显示,轻松解决了当前Android开发最为头疼的碎片化问题之一。先看下面的styles(style_layout.xml) fill_parent fill_parent wrap_content wrap_content 0px 0px 可以看到,layout_width和layout_height两个属性被我封装成了4个style根据实际布局情况,选用当中的一种,不需要自己设置,看过我前一个ActivityGroup的Demo的同学应该非常熟悉了然后我的Demo的布局如下(weight_
17、layout.xml) 整个界面布局看起来非常直观,只是嵌套的逻辑要自己理下。显示效果如下图,其中左面一个是480x800的界面,右面的是320x480的界面(后面的图也如此),可以看出显示比例和代码中完全一致,我就不多说了,大家对照下就能看出来了。二、自定义尺寸法这个是我自己想出来的方法,可能是个比较笨的方法,所以没有多少人提过用这种方法解决自适应的问题。虽然这个方法缺点也很多,但有时候也是个不错的方法。先看下面这张图可以看到我定义了两套尺寸文件,我们可以看下其中一个文件6px12px18px24px30px36px42px48px54px60px66px72px78px84px90px96px102px108px114px120px126px132px138px144px150px156px162px168px174px180px186px192px198px204px210px216px222px228px234px240px246px252px258px264px270px276px282px288px294px300px306px312px318px324px330px336px342px348px354px360px366px372px378px384pxd
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1