




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Android屏幕自适应1、屏幕相关概念1.1 分辨率是指屏幕上有横竖各有多少个像素1.2 屏幕尺寸指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸。android将屏幕大小分为四个级另1J(small,normal,large,andextralarge)。1.3屏幕密度每英寸像素数。手机可以有相同的分辨率,但屏幕尺寸可以不相同,Diagonalpixel表示对角线的像素值(=),DPI=933/3.7=252android将实际的屏幕密度分为四个通用尺寸(low,mediumhigh,andextrahigh)。一般情况下的普通屏幕:ldpi是120dpi
2、,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚1.4密度无关的像素(Density-independentpixeldip)dip是一种虚拟的像素单位。dip和具体像素值的对应公式是dip/pixel=dpi彳K/160,也就是px=dp*(dpi/160)。当你定义应用的布局的UI时应该使用dp单位,确保UI在不同的屏幕上正确显示。目前主要是以分辨率为800*480和854*480的手机用户居多。从以上的屏幕尺寸分布情况上看,其实手机只要考虑3-4.5寸之间密度为1和1.5的手机。2、android多
3、屏幕支持机制Android的支持多屏幕机制即用为当前设备屏幕提供一种合适的方式来共同管理并解析应用资源。Android平台中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合适资源。指定大小(size-specific)的合适资源是指small,normal,large,andxlarge。指定密度(density-specific)的合适资源,是指ldpi(low),mdpi(medium),hdpi(high),andxhdpi(extrahigh)。Android有个自动匹配机制去选择对应的布局和图片资源1)界面布局方面根据物理尺
4、寸的大小准备5套布局:layout(放一些通用布局xml文件,比如界面顶部和底部的布局,不会随着屏幕大小变化,类似windos窗口的titlebar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)2)图片资源方面需要根据dpi值准备5套图片资源:drawable:主要放置xml配置文件或者对分辨率要求较低的图片drawalbe-ldpi:低分辨率的图片,如QVGA(240x320)drawable-mdpi:中等分辨率的图片,如H
5、VGA(320x480)drawable-hdpi:高分辨率的图片,如WVGA(480x800),FWVGA(480x854)drawable-xhdpi:至少960dpx720dpAndroid有个自动匹配机制去选择对应的布局和图片资源。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。3、 AndroidManifest.xml酉己置android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能<supports-screensandroid:large
6、Screens="true"android:normalScreens="true"android:smallScreens="true"android:anyDensity="true"/>3.1是否支持多种不同密度的屏幕android:anyDensity="true"|"false"如果android:anyDensity="true”:指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。如果android:anyDensity="false
7、":应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240X320像素的手机,如果设置android:anyDensity="false",Android系统会将240x320(低密度)转换为320X480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。3.2 是否支持大屏幕android:largeScreens="tru
8、e"|"false"如果在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统使用尺寸为("normal")和密度为("medium)显示,不过会出现一层黑色的背景。3.3 是否支持小屏幕android:smallScreens="true"|"false"如果在声明不支持的小屏幕,而当前屏幕尺寸是smaller的话,系统也使用尺寸为("normal")和密度为("medium)显示。如果应用程序能在小屏幕上正确缩放(最低是small尺寸或最小宽度320dp)
9、,那就不需要用到本属性。否则,就应该为最小屏幕宽度标识符设置本属性来匹配应用程序所需的最小尺寸。4、Android提供3种方式处理屏幕自适应4.1预缩放的资源(基于尺寸和密度去寻找图片)1)如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。2)如果没法找到相应的尺寸,而找到密度,则认为该图片尺寸为"medium",利用缩放显示这个图片。3)如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配"medium"(160)。4.2自动缩放的像素尺寸和坐标(密度兼容)1)如果应用程序不支持不同密度android:anyDensity="f
10、alse",系统自动缩放图片尺寸和这个图片的坐标。2)对于预缩放的资源,当android:anyDensity="false",也不生效。3) android:anyDensity="false",只对密度兼容起作用,尺寸兼容没效果4.3兼容更大的屏幕和尺寸(尺寸兼容)1)对于你在声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为("normal")和密度为("medium)显示。2)对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为("normal&quo
11、t;)和密度为("medium)显示,不过会出现一层黑色的背景。5、Android系统自动适配技巧Android系统采用下面两种方法来实现应用的自动适配:1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent,或者dp进行描述,这样可以保证在屏幕上面展示的时候有合适的大小2)为不同屏幕密度的手机,提供不同的位图资源,可以使得界面清晰无缩放。对应bitmap资源来说,自动的缩放有时会造成放大缩小后的图像变得模糊不清,这是就需要应用为不同屏幕密度配置提供不同的资源:为高密度的屏幕提供高清晰度的图像等。3)不要使用AbsoluteLayout4)像素单位都使
12、用DIP,文本单位使用SP6、在代码中获取屏幕像素、屏幕密度DisplayMetricsmetric=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);intwidth=metric.widthPixels;intheight=metric.heightPixels;floatdensity=metric.density;/intdensityDpi=metric.densityDpi;屏幕宽度(像素)屏幕高度(像素)屏幕密度(0.75/1.0/1.5)屏幕密度DPI(120/160/24
13、07、一般多分辨率处理方法及其缺点7.1 图片缩放基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。7.2 自动定义像素尺寸和位置如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160的屏幕上一样能显示出同样尺寸的效果。例如,要让WVG*精度屏幕和传统的HVGA屏幕一样显示同样
14、尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320X480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)至IJ(150,150)的屏幕显示区域。7.3 兼容更大尺寸的屏幕当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGM精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320X480的,多余的显示区域会被填充成黑色。7.4 采用OpenGL动态绘制图片Android底层提供了OpenGL的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计
15、算机图形学的开发者来讲是一个很大的挑战。一般开发游戏,采用OpenGL方式。7.5多个apk文件Symbian和传统的J2ME就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前GoogleMarket对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk文件适应多个分辨率。以下是Demo首页的预览图一、细说layout_weight目前最为推荐的Android多屏幕自适应解决方案。该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中。其值越小,则对应的layou
16、t_width或layout_height的优先级就越高,一般横向布局中,决定的是layout_width的优先级;纵向布局中,决定的是layout_height的优先级。传统的layout_weight使用方法是将当前控件的layout_width和layout_height都设置成fill_parent,这样就可以把控件的显示比例完全交给layout_weight;这样使用的话,就出现了layout_weight越小,显示比例越大的情况。不过又于2个控件还好,如果控件过多,且显示比例也不相同的时候,控制起来就比较麻烦了,毕竟反比不是那么好确定的。于是就有了现在最为流行的0px设值法。看似让
17、人难以理解的layout_height=0px的写法,结合layout_weight,却可以使控件成正比例显示,轻松解决了当前Android开发最为头疼的碎片化问题之一。先看下面的styles(style_layout.xml)<?xmlversion="1.0"encoding="utf-8"?><resources><!-全屏帚拉伸-><stylename="layout_full"><itemname="android:layout_width">f
18、ill_parent</item><itemname="android:layout_height">fill_parent</item></style><!-固定自身大小-><stylename="layout_wrap"><itemname="android:layout_width">wrap_content</item><itemname="android:layout_height">wrap_co
19、ntent</item></style><!-横向分布-><stylename="layout_horizontal"parent="layout_full"><itemname="android:layout_width">0px</item></style><!-纵向分布-><stylename="layout_vertical"parent="layout_full"><ite
20、mname="android:layout_height">0px</item></style></resources>4个styleActivityGroup可以看到,layout_width和layout_height两个属性被我封装成了根据实际布局情况,选用当中的一种,不需要自己设置,看过我前一个的Demo的同学应该非常熟悉了然后我的Demo的布局如下(weight_layout.xml)<?xmlversion="1.0"encoding="utf-8"?><Line
21、arLayoutxmlns:android="http:style="style/layout_full"android:orientation="vertical"><LinearLayoutstyle="style/layout_vertical"android:layout_weight="1"android:orientation="horizontal"><Viewstyle="style/layout_horizontal"and
22、roid:background="#aa0000"android:layout_weight="1"/><Viewandroid:background="#00aa00"android:layout_weight="4"/><Viewstyle="style/layout_horizontal"android:background="#0000aa"android:layout_weight="3"/><Viewstyl
23、e="style/layout_horizontal"android:background="#aaaaaa"android:layout_weight="2"/></LinearLayout><LinearLayoutstyle="style/layout_vertical"android:layout_weight="2"android:orientation="vertical"><Viewstyle="style/layo
24、ut_vertical"android:background="#ffffff"android:layout_weight="4"/><Viewstyle="style/layout_vertical"android:background="#aa0000"android:layout_weight="3"/><Viewstyle="style/layout_vertical"android:background="#00aa00&
25、quot;android:layout_weight="2"/><Viewstyle="style/layout_vertical"android:background="#0000aa"android:layout_weight="1"/></LinearLayout></LinearLayout>整个界面布局看起来非常直观,只是嵌套的逻辑要自己理下。显示效果如下图,其中左面一个是480x800的界面,右面的是320x480的界面(后面的图也如此),可以看出显示比例和代码
26、中完全一致,我就不多说了,大家对照下就能看出来了。二、自定义尺寸法这个是我自己想出来的方法,可能是个比较笨的方法,所以没有多少人提过用这种方法解决自适应的问题。虽然这个方法缺点也很多,但有时候也是个不错的方法。先看下面这张图上,-vaJues-43|>)t320&dimens_heightjcmIHdimendth.xm弊glugs-BbOHBO:Mdimens_heig!it.xml比dimens_wiclth.j(mliAnciroidMarifest.xml目Qfjultpypm®4rimm10rxric可以看到我定义了两套尺寸文件,我们可以看下其中一个文件?&g
27、t;<?xmlversion="1.0"encoding="utf-8"<resources><dimenname="height_1_80">6px</dimen><dimenname="height_2_80">12px</dimen><dimenname="height_3_80">18px</dimen><dimenname="height_4_80">24px<
28、;/dimen><dimenname="height_5_80">30px</dimen><dimenname="height_6_80">36px</dimen><dimenname="height_7_80">42px</dimen><dimenname="height_8_80">48px</dimen><dimenname="height_9_80">54px</dim
29、en><dimenname="height_10_80">60px</dimen><dimenname="height_11_80">66Px</dimen><dimenname="height_12_80">72px</dimen><dimenname="height_13_80">78px</dimen><dimenname="height_14_80">84px</dim
30、en><dimenname="height_15_80">90px</dimen><dimenname="height_16_80">96px</dimen><dimenname="height_17_80">102px</dimen><dimenname="height_18_80">108px</<dimenname="height_19_80">dimen114px></
31、dimen><dimenname="height_20_80">120px</<dimenname="height_21_80">dimen126px></dimen><dimenname="height_22_80">132px</<dimenname="height_23_80">dimen138px></dimen><dimenname="height_24_80">144px
32、</<dimenname="height_25_80">dimen150px></dimen><dimenname="height_26_80">156px</<dimenname="height_27_80">dimen162px></dimen><dimenname="height_28_80">168px</<dimenname="height_29_80">dimen174p
33、x></dimen><dimenname="height_30_80">180px</<dimenname="height_31_80">dimen186px></dimen><dimenname="height_32_80">192px</<dimenname="height_33_80">dimen198px></dimen><dimenname="height_34_80"
34、;>204px</<dimenname="height_35_80">dimen210px></dimen><dimenname="height_36_80">216px</<dimenname="height_37_80">dimen222px></dimen><dimenname="height_38_80">228px</<dimenname="height_39_80">
35、;dimen234px></dimen><dimenname="height_40_80">240px</<dimenname="height_41_80">dimen246px></dimen><dimenname="height_42_80">252px</<dimenname="height_43_80">dimen258px></dimen><dimenname="height_
36、44_80">264px</<dimenname="height_45_80">dimen270px></dimen><dimenname="height_46_80">276px</<dimenname="height_47_80">dimen282px></dimen><dimenname="height_48_80">288px</dimen>文件中的代码,我把整个高度分<dime
37、nname="height_49_80">name="height_50_80">300px<dimenname="height_51_80">name="height_52_80">312px<dimenname="height_53_80">name="height_54_80">324px<dimenname="height_55_80">name="height_56_80&qu
38、ot;>336px<dimenname="height_57_80">name="height_58_80">348px<dimenname="height_59_80">name="height_60_80">360px<dimenname="height_61_80">name="height_62_80">372px<dimenname="height_63_80">name=&
39、quot;height_64_80">384px<dimenname="height_65_80">name="height_66_80">396px<dimenname="height_67_80">name="height_68_80">408px<dimenname="height_69_80">name="height_70_80">420px<dimenname="height_7
40、1_80">name="height_72_80">432px<dimenname="height_73_80">name="height_74_80">444px<dimenname="height_75_80">name="height_76_80">456px<dimenname="height_77_80">name="height_78_80">468px<dime
41、nname="height_79_80">name="height_80_80">480px</resources>.这个是values-480x320294px</dimen><dimen</dimen>306px</dimen><dimen</dimen>318px</dimen><dimen</dimen>330px</dimen><dimen</dimen>342px</dimen><d
42、imen</dimen>354px</dimen><dimen</dimen>366px</dimen><dimen</dimen>378px</dimen><dimen</dimen>390px</dimen><dimen</dimen>402px</dimen><dimen</dimen>414px</dimen><dimen</dimen>426px</dimen><dimen&l
43、t;/dimen>438px</dimen><dimen</dimen>450px</dimen><dimen</dimen>462px</dimen><dimen</dimen>474px</dimen><dimen</dimen>文件夹下dimens_height.xml成了80等分,这是因为大部分屏幕的宽度或高度都是80的整数倍(个别特殊的除外),不同的等分在不同的分辨率中设定不同的尺寸值。由于每一套界面都要写一套,所以有些同学可能觉着不太好,不过这个写起来比较简
44、单,而且以后也不用改,所以有时候也可以考虑用一下!再看我Demo的布局代码(dimen_layout.xml)<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:androidandroid:layout_width="http:="fill_parent"="dimen/width_76_80”="dimen/height_10_80”="#ffcccc"="dimen/width_2_80&quo
45、t;/>"fill_parent"l_parent">="dimen/width_30_80”="dimen/height_50_80"="#ccccff"="dimen/height_5_80"/>="fill_parent"="fill_parent"="vertical">width="dimen/width_30_80”="dimen/height_5_80"="#
46、ccffcc"="dimen/height_1_80"="5"/>width="dimen/width_30_80”="dimen/height_10_80”="#ccffcc"="dimen/height_1_80"="10"/>width="dimen/width_30_80”="dimen/height_15_80”="#ccffcc"="dimen/height_1_80"="
47、15"/>width="dimen/width_30_80”="dimen/height_20_80"="#ccffcc"="20"/><Viewandroid:layout_widthandroid:layout_heightandroid:backgroundandroid:layout_margin<LinearLayoutandroid:layout_width=android:layout_height<Viewandroid:layout_widthandroid:layo
48、ut_heightandroid:backgroundandroid:layout_margin<LinearLayoutandroid:layout_widthandroid:layout_heightandroid:orientation<Buttonandroid:layoutandroid:layout_heightandroid:backgroundandroid:layout_marginBottomandroid:text<Buttonandroid:layoutandroid:layout_heightandroid:backgroundandroid:lay
49、out_marginBottomandroid:text<Buttonandroid:layoutandroid:layout_heightandroid:backgroundandroid:layout_marginBottomandroid:text<Buttonandroid:layoutandroid:layout_heightandroid:backgroundandroid:text</LinearLayout></LinearLayout></LinearLayout>以上是我写的统一的布局代码,来看下在两个不同分辨率的模拟器上的显
50、示效果吧(大家注意我的代码中有margin这样的值也用到了自定义尺寸,如果这个margin使用layout_weight来控制的话,无疑要多嵌套一层线性布局,所以说没有一个方法是十全十美的,这第2个方法有时候用起来反而还要方便一些)三、在java代码中设置宽高度也许很多人会反对这种方法,因为即使是官方也是推荐使用xml的方式写布局。不过我们在这不会像Swing那样写那么多麻烦的布局代码,因为我们只是在代码中重新设定控件的宽高度而已,其他属性依然是交给xml布局文件的。这个方法其实是我跟同事偷学来的,虽然我不赞成这样的方法,但他确确实实也是解决屏幕自适应问题的方案之一,而且它没我想象的那么复杂,
51、其实很简单。首先我们要做的是获取当前屏幕的宽高度,因为这个在后面要用到我们可以写两个静态变量用来保存当前屏幕的宽高度:publicclassConstantpublicstaticintdisplayWidth;/屏幕宽度publicstaticintdisplayHeight;/屏幕高度)然后在第一个Activity启动的时候,获取这两个值DisplayMetricsdisplayMetrics=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);Constant.disp
52、layWidth=displayMetrics.widthPixels;Constant.displayHeight=displayMetrics.heightPixels;布局代码我们可以全都统一写成wrap-content,其实写成什么都无所谓,因为这个值只是暂时的<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http:android:orientation="vertical"android:layout_width=&
53、quot;fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#ffcccc"android:text="aaaaaaaa"/><Buttonandroid:id=
54、"+id/btn2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#ccffcc"android:text="bbbbbbbbb"/><Buttonandroid:id="+id/btn3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#ccccff"android:text="ccccccccc"/><Buttonandroid:id="+id/btn4"android:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业管理人员安全培训考试试题及答案【考点梳理】
- 2025年企业主要负责人安全培训考试试题完整参考答案
- 2025年公司及项目部安全培训考试试题附答案【模拟题】
- 2025标准店铺租赁合同协议
- 2025工程承包合同范本 建筑工程施工合同样本
- 2025深圳市汽车租赁合同书模板
- 2025年劳动合同解除标准范本
- 2025年新款代理合同协议书模板
- 2025钢筋制作合同模板
- 2025【视障人士康复按摩师劳动合同】视障人士康复按摩样本
- 游艇会服务流程
- 高压带电显示器说明书全解
- 数据中心基础设施管理系统DCIM技术方案
- 企业网络安全与数据保护策略
- 2024届高考英语语法填空专项课件
- 小水滴的诉说省公开课一等奖新名师优质课比赛一等奖课件
- 第五课滴答滴答下雨了课件
- 新教师岗前培训讲座中小学教学常规PPT
- 李子奈《计量经济学》(第5版)笔记和典型题(含考研真题)详解
- 现浇梁钢管柱+贝雷片支架验收表
- 《肖申克的救赎》中英双语剧本
评论
0/150
提交评论