Android屏幕自适应.docx

上传人:b****1 文档编号:2952523 上传时间:2023-05-05 格式:DOCX 页数:24 大小:542.56KB
下载 相关 举报
Android屏幕自适应.docx_第1页
第1页 / 共24页
Android屏幕自适应.docx_第2页
第2页 / 共24页
Android屏幕自适应.docx_第3页
第3页 / 共24页
Android屏幕自适应.docx_第4页
第4页 / 共24页
Android屏幕自适应.docx_第5页
第5页 / 共24页
Android屏幕自适应.docx_第6页
第6页 / 共24页
Android屏幕自适应.docx_第7页
第7页 / 共24页
Android屏幕自适应.docx_第8页
第8页 / 共24页
Android屏幕自适应.docx_第9页
第9页 / 共24页
Android屏幕自适应.docx_第10页
第10页 / 共24页
Android屏幕自适应.docx_第11页
第11页 / 共24页
Android屏幕自适应.docx_第12页
第12页 / 共24页
Android屏幕自适应.docx_第13页
第13页 / 共24页
Android屏幕自适应.docx_第14页
第14页 / 共24页
Android屏幕自适应.docx_第15页
第15页 / 共24页
Android屏幕自适应.docx_第16页
第16页 / 共24页
Android屏幕自适应.docx_第17页
第17页 / 共24页
Android屏幕自适应.docx_第18页
第18页 / 共24页
Android屏幕自适应.docx_第19页
第19页 / 共24页
Android屏幕自适应.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Android屏幕自适应.docx

《Android屏幕自适应.docx》由会员分享,可在线阅读,更多相关《Android屏幕自适应.docx(24页珍藏版)》请在冰点文库上搜索。

Android屏幕自适应.docx

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=252

android将实际的屏幕密度分为四个通用尺寸(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在不同的屏幕上正确显示。

目前主要是以分辨率为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:

至少960dpx720dp

Android有个自动匹配机制去选择对应的布局和图片资源。

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

3、AndroidManifest.xml配置

android从1.6和更高,Google为了方便开发者对于各种分辨率机型的移植而增加了自动适配的功能

android:

largeScreens="true"

android:

normalScreens="true"

android:

smallScreens="true"

android:

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)不要使用AbsoluteLayout

4)像素单位都使用DIP,文本单位使用SP

6、在代码中获取屏幕像素、屏幕密度

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文件适应多个分辨率。

以下是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)

xmlversion="1.0"encoding="utf-8"?

>

--全屏幕拉伸-->

layout_width">fill_parent

layout_height">fill_parent

--固定自身大小-->

layout_width">wrap_content

layout_height">wrap_content

--横向分布-->

layout_width">0px

--纵向分布-->

layout_height">0px

可以看到,layout_width和layout_height两个属性被我封装成了4个style

根据实际布局情况,选用当中的一种,不需要自己设置,看过我前一个ActivityGroup的Demo的同学应该非常熟悉了

然后我的Demo的布局如下(weight_layout.xml)

xmlversion="1.0"encoding="utf-8"?

>

android="

style="@style/layout_full"

android:

orientation="vertical">

style="@style/layout_vertical"

android:

layout_weight="1"

android:

orientation="horizontal">

style="@style/layout_horizontal"

android:

background="#aa0000"

android:

layout_weight="1"/>

style="@style/layout_horizontal"

android:

background="#00aa00"

android:

layout_weight="4"/>

style="@style/layout_horizontal"

android:

background="#0000aa"

android:

layout_weight="3"/>

style="@style/layout_horizontal"

android:

background="#aaaaaa"

android:

layout_weight="2"/>

style="@style/layout_vertical"

android:

layout_weight="2"

android:

orientation="vertical">

style="@style/layout_vertical"

android:

background="#ffffff"

android:

layout_weight="4"/>

style="@style/layout_vertical"

android:

background="#aa0000"

android:

layout_weight="3"/>

style="@style/layout_vertical"

android:

background="#00aa00"

android:

layout_weight="2"/>

style="@style/layout_vertical"

android:

background="#0000aa"

android:

layout_weight="1"/>

整个界面布局看起来非常直观,只是嵌套的逻辑要自己理下。

显示效果如下图,其中左面一个是480x800的界面,右面的是320x480的界面(后面的图也如此),可以看出显示比例和代码中完全一致,我就不多说了,大家对照下就能看出来了。

二、自定义尺寸法

这个是我自己想出来的方法,可能是个比较笨的方法,所以没有多少人提过用这种方法解决自适应的问题。

虽然这个方法缺点也很多,但有时候也是个不错的方法。

先看下面这张图

 

可以看到我定义了两套尺寸文件,我们可以看下其中一个文件

xmlversion="1.0"encoding="utf-8"?

>

6px12px

18px24px

30px36px

42px48px

54px60px

66px72px

78px84px

90px96px

102px108px

114px120px

126px132px

138px144px

150px156px

162px168px

174px180px

186px192px

198px204px

210px216px

222px228px

234px240px

246px252px

258px264px

270px276px

282px288px

294px300px

306px312px

318px324px

330px336px

342px348px

354px360px

366px372px

378px384px

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2