




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)。一般情况下的普通屏幕: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寸之间密度为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)。android有个自动匹配机制去选择对应的布局和图片资源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:低分辨率的图片,如qvga (240x320)drawable-mdpi:中等分辨率的图片,如hvga (320x480)drawable-hdpi:高分辨率的图片,如wvga (480x800),fwvga (480x854)drawable-xhdpi:至少960dp x 720dpandroid有个自动匹配机制去选择对应的布局和图片资源。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。3、androidmanifest.xml 配置android从1.6和更高,google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能3.1是否支持多种不同密度的屏幕android:anydensity=true | false 如果android:anydensity=true:指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。如果android:anydensity=false:应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240320像素的手机,如果设置android:anydensity=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)显示。如果应用程序能在小屏幕上正确缩放(最低是small尺寸或最小宽度320dp),那就不需要用到本属性。否则,就应该为最小屏幕宽度标识符设置本属性来匹配应用程序所需的最小尺寸。4、android提供3种方式处理屏幕自适应4.1预缩放的资源(基于尺寸和密度去寻找图片)1)如果找到相应的尺寸和密度,则利用这些图片进行无缩放显示。2)如果没法找到相应的尺寸,而找到密度,则认为该图片尺寸为 medium,利用缩放显示这个图片。3)如果都无法匹配,则使用默认图片进行缩放显示。默认图片默认标配 medium (160)。4.2自动缩放的像素尺寸和坐标(密度兼容)1)如果应用程序不支持不同密度android:anydensity=false,系统自动缩放图片尺寸和这个图片的坐标。2)对于预缩放的资源,当android:anydensity=false,也不生效。3)android:anydensity=false,只对密度兼容起作用,尺寸兼容没效果4.3兼容更大的屏幕和尺寸(尺寸兼容)1)对于你在声明不支持的大屏幕,而这个屏幕尺寸是normal的话,系统使用尺寸为 (normal)和密度为(medium)显示。2)对于你在声明不支持的大屏幕,而这个屏幕尺寸是larger的话,系统同样使用尺寸为(normal)和密度为(medium)显示,不过会出现一层黑色的背景。5、android系统自动适配技巧android系统采用下面两种方法来实现应用的自动适配:1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小2)为不同屏幕密度的手机,提供不同的位图资源,可以使得界面清晰无缩放。对应bitmap 资源来说,自动的缩放有时会造成放大缩小后的图像变得模糊不清,这是就需要应用为不同屏幕密度配置提供不同的资源:为高密度的屏幕提供高清晰度的图像等。3)不要使用absolutelayout4)像素单位都使用dip,文本单位使用sp6、在代码中获取屏幕像素、屏幕密度displaymetrics metric = 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、 一般多分辨率处理方法及其缺点7.1 图片缩放基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如helloandroid中drawable-hdpi 中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。7.2 自动定义像素尺寸和位置如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160 的屏幕上一样能显示出同样尺寸的效果。例如,要让wvga 高精度屏幕和传统的hvga 屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。7.3 兼容更大尺寸的屏幕当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,wvga 中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320480 的,多余的显示区域会被填充成黑色。7.4 采用opengl 动态绘制图片android 底层提供了opengl 的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计算机图形学的开发者来讲是一个很大的挑战。一般开发游戏,采用opengl 方式。7.5 多个apk 文件symbian 和传统的j2me 就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前google market 对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk 文件适应多个分辨率。以下是demo首页的预览图一、细说layout_weight目前最为推荐的android多屏幕自适应解决方案。该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中。其值越小,则对应的layout_width或layout_height的优先级就越高,一般横向布局中,决定的是layout_width的优先级;纵向布局中,决定的是layout_height的优先级。传统的layout_weight使用方法是将当前控件的layout_width和layout_height都设置成fill_parent,这样就可以把控件的显示比例完全交给layout_weight;这样使用的话,就出现了layout_weight越小,显示比例越大的情况。不过对于2个控件还好,如果控件过多,且显示比例也不相同的时候,控制起来就比较麻烦了,毕竟反比不是那么好确定的。于是就有了现在最为流行的0px设值法。看似让人难以理解的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_layout.xml) 整个界面布局看起来非常直观,只是嵌套的逻辑要自己理下。显示效果如下图,其中左面一个是480x800的界面,右面的是320x480的界面(后面的图也如此),可以看出显示比例和代码中完全一致,我就不多说了,大家对照下就能看出来了。二、自定义尺寸法这个是我自己想出来的方法,可能是个比较笨的方法,所以没有多少人提过用这种方法解决自适应的问题。虽然这个方法缺点也很多,但有时候也是个不错的方法。先看下面这张图可以看到我定义了两套尺寸文件,我们可以看下其中一个文件6px12px18px24px30px36px42px48px54px60px66px72px78px84px90px96px102px108px114px120px126px132px138px144px150px156px162px168px174px180px186px192px198px204px210px216px222px228px234px240px246px252px258px264px270px276px282px288px294px300px306px312px318px324px330px336px342px348px354px360px366px372px378px384px390px396px402px408px414px420px426px432px438px444px450px456px462px468px474px480px 这个是values-480x320文件夹下dimens_height.xml文件中的代码,我把整个高度分成了80等分,这是因为大部分屏幕的宽度或高度都是80的整数倍(个别特殊的除外),不同的等分在不同的分辨率中设定不同的尺寸值。由于每一套界面都要写一套,所以有些同学可能觉着不太好,不过这个写起来比较简单,而且以后也不用改,所以有时候也可以考虑用一下!再看我demo的布局代码(dimen_layout.xml) 以上是我写的统一的布局代码,来看下在两个不同分辨率的模拟器上的显示效果吧(大家注意我的代码中有margin这样的值也用到了自定义尺寸,如果这个margin使用layout_weight来控制的话,无疑要多嵌套一层线性布局,所以说没有一个方法是十全十美的,这第2个方法有时候用起来反而还要方便一些)三、在java代码中设置宽高度也许很多人会反对这种方法,因为即使是官方也是推荐使用xml的方式写布局。不过我们在这不会像swing那样写那么多麻烦的布局代码,因为我们只是在代码中重新设定控件的宽高度而已,其他属性依然是交给xml布局文件的。这个方法其实是我跟同事偷学来的,虽然我不赞成这样的方法,但他确确实实也是解决屏幕自适应问题的方案之一,而且它没我想象的那么复杂,其实很简单。首先我们要做的是获取当前屏幕的宽高度,因为这个在后面要用到我们可以写两个静态变量用来保存当前屏幕的宽高度:public class constant public static int displaywidth; /屏幕宽度 public static int displayheight; /屏幕高度然后在第一个activity启动的时候,获取这两个值 displaymetrics displaymetrics = new displaymetrics(); getwindowmanager().getdefaultdisplay().getmetrics(displaymetrics); constant.displaywidth = displaymetrics.widthpixels; constant.displayheight = displaymetrics.heightpixels;布局代码我们可以全都统一写成wrap-content,其实写成什么都无所谓,因为这个值只是暂时的 最后我们在activity的oncreate方法里这么做 / 第一个按钮,宽度100%,高度10% linearlayout.layoutparams params = new linearlayout.layoutparams( layoutparams.fill_parent, (int) (constant.displayheight * 0.1f + 0.5f); btn1.setlayoutparams(params); / 第二个按钮,宽度100%,高度30% linearlayout.layoutparams params2 = new linearlayout.layoutparams( layoutparams.fill_parent, (int) (constant.displayheight * 0.3f + 0.5f); btn2.setlayoutparams(params2); / 第三个按钮,宽度50%,高度20% linearlayout.layoutparams params3 = new linearlayout.layoutparams( (int) (constant.displaywidth * 0.5f + 0.5f), (int) (constant.displayheight * 0.2f + 0.5f); btn3.setlayoutparams(params3); / 第三个按钮,宽度70%,高度填满剩下的空间 linearlayout.layoutparams params4 = new linearlayout.layoutparams( (int) (constant.displaywidth * 0.7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邮储银行2025宁波市数据分析师笔试题及答案
- 交通银行2025丹东市小语种岗笔试题及答案
- 邮储银行2025莆田市秋招笔试EPI能力测试题专练及答案
- 工商银行2025湛江市秋招笔试EPI能力测试题专练及答案
- 中国银行2025北京市秋招笔试EPI能力测试题专练及答案
- 建设银行2025威海市秋招笔试EPI能力测试题专练及答案
- 工商银行2025遵义市金融科技岗笔试题及答案
- 教师招聘之《幼儿教师招聘》能力提升打印大全及答案详解(历年真题)
- 中国银行2025贵港市数据分析师笔试题及答案
- 建设银行2025南平市秋招笔试性格测试题专练及答案
- 2025年TCL集团校园招聘笔试模拟试题及答案解析
- 2021-2025年高考化学真题知识点分类汇编之氮及其化合物
- 2025-2026学年人教版小学劳动技术二年级上册教学计划及进度表
- 2025西藏日喀则市高级技工学校招聘专业实训指导教师和后勤保障人员20人备考练习题库及答案解析
- 危重患者安全转运指南
- 2025中级经济师《建筑与房地产经济》章节千题
- 医院医患纠纷处理课件
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册教学计划及进度表
- 手机行业知识培训课件
- 湖北省腾云联盟2026届高三8月联考物理(含答案)
- 教学资料管理制度
评论
0/150
提交评论