Android横竖屏切换和自适应屏幕

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

android系统如何自适应屏幕大小1、屏幕相关概念1.1分辨率是指屏幕上有横竖各有多少个像素1.2屏幕尺寸指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸android将屏幕大小分为四个级别(small,normal,large,andextralarge)。1.3屏幕密度每英寸像素数手机可以有相同的分辨率,但屏幕尺寸可以不相同,Diagonalpixel表示对角线的像素值(=),DPI=933/3.7=252android将实际的屏幕密度分为四个通用尺寸(low,medium,high,andextrahigh)一般情况下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚1.4密度无关的像素(Density-independentpixel——dip)dip是一种虚拟的像素单位dip和具体像素值的对应公式是dip/pixel=dpi值/160,也就是px=dp*(dpi/160)当你定义应用的布局的UI时应该使用dp单位,确保UI在不同的屏幕上正确显示。手机屏幕分类和像素密度的对应关系如表1所示手机尺寸分布情况()如图所示,目前主要是以分辨率为800*480和854*480的手机用户居多从以上的屏幕尺寸分布情况上看,其实手机只要考虑3-4.5寸之间密度为1和1.5的手机2、android多屏幕支持机制Android的支持多屏幕机制即用为当前设备屏幕提供一种合适的方式来共同管理并解析应用资源。Android平台中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合适资源。指定大小(size-specific)的合适资源是指small,normal,large,andxlarge。指定密度(density-specific)的合适资源,是指ldpi(low),mdpi(medium),hdpi(high),andxhdpi(extrahigh).Android有个自动匹配机制去选择对应的布局和图片资源1)界面布局方面根据物理尺寸的大小准备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:中等分辨率的图片,如HVGA(320x480)drawable-hdpi:高分辨率的图片,如WVGA(480x800),FWVGA(480x854)drawable-xhdpi:至少960dpx720dpAndroid有个自动匹配机制去选择对应的布局和图片资源。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。3、AndroidManifest.xml配置android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能supports-screensandroid:largeScreens=trueandroid:normalScreens=trueandroid:smallScreens=trueandroid:anyDensity=true/3.1是否支持多种不同密度的屏幕android:anyDensity=[true|false]如果android:anyDensity=true指应用程序支持不同密度,会根据屏幕的分辨率自动去匹配。如果android:anyDensity=false应用程序支持不同密度,系统自动缩放图片尺寸和这个图片的坐标。具体解释一下系统是如何自动缩放资源的。例如我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240×320像素的手机,如果设置android:anyDensity=false,Android系统会将240x320(低密度)转换为320×480(中密度),这样的话,应用就会在小密度手机上加载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、在代码中获取屏幕像素、屏幕密度DisplayMetricsmetric=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metric);intwidth=metric.widthPixels;//屏幕宽度(像素)intheight=metric.heightPixels;//屏幕高度(像素)floatdensity=metric.density;//屏幕密度(0.75/1.0/1.5)intdensityDpi=metric.densityDpi;//屏幕密度DPI(120/160/240)7、一般多分辨率处理方法及其缺点7.1图片缩放基于当前屏幕的精度,平台自动加载任何未经缩放的限定尺寸和精度的图片。如果图片不匹配,平台会加载默认资源并且在放大或者缩小之后可以满足当前界面的显示要求。例如,当前为高精度屏幕,平台会加载高精度资源(如HelloAndroid中drawable-hdpi中的位图资源),如果没有,平台会将中精度资源缩放至高精度,导致图片显示不清晰。7.2自动定义像素尺寸和位置如果程序不支持多种精度屏幕,平台会自动定义像素绝对位置和尺寸值等,这样就能保证元素能和精度160的屏幕上一样能显示出同样尺寸的效果。例如,要让WVGA高精度屏幕和传统的HVGA屏幕一样显示同样尺寸的图片,当程序不支持时,系统会对程序慌称屏幕分辨率为320×480,在(10,10)到(100,100)的区域内绘制图形完成之后,系统会将图形放大到(15,15)到(150,150)的屏幕显示区域。7.3兼容更大尺寸的屏幕当前屏幕超过程序所支持屏幕的上限时,定义supportsscreens元素,这样超出显示的基准线时,平台在此显示黑色的背景图。例如,WVGA中精度屏幕上,如程序不支持这样的大屏幕,系统会谎称是一个320×480的,多余的显示区域会被填充成黑色。7.4采用OpenGL动态绘制图片Android底层提供了OpenGL的接口和方法,可以动态绘制图片,但是这种方式对不熟悉计算机图形学的开发者来讲是一个很大的挑战。一般开发游戏,采用OpenGL方式。7.5多个apk文件Symbian和传统的J2ME就是采用这种方式,为一款应用提供多个分辨率版本,用户根据自己的需求下载安装相应的可执行文件。针对每一种屏幕单独开发应用程序不失为一种好方法,但是目前GoogleMarket对一个应用程序多个分辨率版本的支持还不完善,开发者还是需要尽可能使用一个apk文件适应多个分辨率。Android横竖屏切换总结Android横竖屏要解决的问题应该就两个:一.布局问题二.重新载入问题1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:unspecified:默认值由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.landscape:横屏显示(宽比高要长)portrait:竖屏显示(高比宽要长)user:用户当前首选的方向behind:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)sensor:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。nosensor:忽略物理感应器,这样就不会随着用户旋转设备而更改了(unspecified设置除外)。也可以在Java代码中通过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)来设置。如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:1)在res目录下建立layout-land和layout-port目录,相应的layout文件不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。2)通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功