貌似这个适配靠谱些
2012-11-19 22:44
525 查看
如何将一个应用法度适配在不合的手机上,固然这不算是一个技巧题目,然则对于方才做屏幕的开辟人员来说,还真不是一件多么简单的工作。
起首:你须要在AndroidManifest.xml文件的<manifest>元素如下添加子元素
<supports-screens
android:normalScreens="true"android:anyDensity="true"
android:smallScreens="true"></supports-screens>
名如其意,以上是为我们的屏幕设置多辨别率支撑(更正确的说是适配大、中、小三种密度)。android:anyDensity=这一句对全部的屏幕都起着十分首要的感化,值为true,我们的应用法度当安装在不合密度的手机上时,法度会分别加载hdpi,mdpi,ldpi文件夹中的资料。
false,即使我们在hdpi,mdpi,ldpi文件夹下拥有同一种资料,那么应用也不会主动地去响应文件夹下寻找资料,这种景象都是呈如今高密度,以及低密度的手机上,比如说一部240×320像素的手机,若是设置android:anyDensity=Android体系会将240 x 320(低密度)转换为320×480(中密度)mdpi文件中的资料。
2.细心的人会发明自android2.0开端之后drawable文件被三个文件夹drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹所庖代,有些编程人员为了让应用法度默认地加载某些图片,他们会特地地去在android2.0之后的应用法度中从头创建drawable文件夹,其实如许做完全没有须要,经由过程第一段的解析我们得知,android:anyDensity=则应用会将大小密度改变成中密度,从而去加载mdpi中的资料。这里同样,当android:anyDensity=则应用会去加载mdpi中的资料。
第一:android:anyDensity=体系会根据屏幕密度,主动去找对应的文件夹
第二:android:anyDensity="false",
若是drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹中有同一张图片资料的不合密度默示,那么体系会去加载drawable_mdpi文件夹中的资料
若是drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资料,那么体系会去加载drawable-hdpi中的资料。
若是drawable-hdpi,drawable-mdpi中有图片资料,drawable-ldpi中没有对应的图片资料,那么体系会加载drawable-mdpi文件夹中的资料
drawable-hdpi该图片即实用于横屏,也实用于竖屏
drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹中的资料
drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资料
3.有时辰会按照须要在代码中动态地设置某个值,比如地图,地图的pin和地图的地址提示框的相对偏移量在不合密度的手机上是不合的。这时辰可以经由过程以下办法求出屏幕密度:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int densityDpi = metric.densityDpi; //屏幕密度DPI(120 / 160 / 240)
然则这种办法最好不要应用,最好的体式格式是在xml文件中不合密度的手机进行分别设置。
这里地图的偏移量可以在values-hpdi,values-mdpi,values-ldpi三种文件夹中的dimens.xml文件进行设置
<dimenname="bitmap_common_topoffset">40dp</dimen>
<dimenname="bitmap_common_bottomoffset">-14dp</dimen>
4. 各大手机厂商对于Android操纵体系都有或多或少的批改,当然这些批改会对我们应用法度产生某些影响
(1)系统源代码中连接music服务的aidl文件所在包名:com.android.music
(2)LG则可能将该aidl文件批改地点的包(例如批改为 com.android.music.player),并且批改此中的文件内容(增长一个办法,或者削减几个办法,或者批改办法名称)那么我们的应用要想在LG的手机上公布,那么我们就必须改变所要连接的aidl文件,必须跟LG厂商批改的完全一致。
1、基本概念
屏幕大小(screen size) – 屏幕的实际大小,用屏幕对角线长度来衡量(比如3.4寸,3.8寸)。android把屏幕分为以下4种:small,normal,large,extra large。
怎么判断?
屏幕密度(Screen Density) - 一块实际的屏幕区域有多少个像素,一般用dpi衡量(每英寸有多少个点)。相比起medium、high屏幕密度的设备,在一块确定大小的屏幕区域l密度为low的屏幕拥有的像素更少。android把屏幕密度分为4种:low,medium,high,extra high。
如何判断是ldpi,mdpi,hdpi?
方向(orientation) - 屏幕方向分为landscape(横屏)和portrait(竖屏)。
分辨率(Resolution) - 屏幕上的总实际像素数。对屏幕进行适配时,一般不关注它的分辨率,只关注它的屏幕大小和密度。
与密度无关的像素(Density-independent pixel,dp或dip) - 为了保证你的UI适合不同的屏幕密度,建议你采用dp来定义程序UI。
它的计算方法为:px = dp * (dpi / 160)
sp(scale-independent pixel)
如何分辨一个屏幕是ldpi、mdpi、hdpi的方法,见下图
计算屏幕密度
2、怎样适配多种屏幕
a.在manifest里定义你的程序支持的屏幕类型,相应代码如下:
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"] //是否支持小屏
android:normalScreens=["true" | "false"] //是否支持中屏
android:largeScreens=["true" | "false"] //是否支持大屏
android:xlargeScreens=["true" | "false"] //是否支持超大屏
android:anyDensity=["true" | "false"] //是否支持多种不同密度的屏幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>
b.对不同大小的屏幕提供不同的layout。
比如,如果需要对大小为large的屏幕提供支持,需要在res目录下新建一个文件夹layout-large/并提供layout。当然,也可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。
c.对不同密度的屏幕提供不同的图片。
应尽量使用点9格式的图片,如需对密度为low的屏幕提供合适的图片,需新建文件夹drawable-ldpi/,并放入合适大小的图片。相应的,medium对应drawable-mdpi /,high对应drawable-hdpi/,extra high对应drawable-xhdpi/。
图片大小的确定:low:medium:high:extra high比例为3:4:6:8。举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra high为96×96。
不同密度的屏幕对应的图片比例
3、多屏幕适配的4条黄金原则
a.在layout文件中设置控件尺寸时应采用wrap_content,fill_parent和dp。
具体来说,设置view的属性android:layout_width和android:layout_height的值时,wrap_content,fill_parent或dp比pix更好。相应地,为了使文字大小更好的适应屏幕应该使用sp来定义文字大小。
b.在程序的代码中不要出现具体的像素值。
为了使代码简单,android内部使用pix为单位表示控件的尺寸,但这是基于当前屏幕基础上的。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。
c.不要使用AbsoluteLayout(android1.5已废弃) 。相应地,应使用RelativeLayout。
d.对不同的屏幕提供合适大小的图片。见上面第2部分。
4、需要注意的地方
以上设置适用于android3.2以下的版本。(本人目前开发是在android2.2上,这部分以后再补充)
5、怎样测试你的程序是否支持多屏幕适配
一般使用AVD Manager创建多个不同大小的模拟器,如下图
相关文章推荐
- HTML5 <address> Tag,这个标签貌似挺常用
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- 这个社会不是高手不多,而是靠谱的…
- linux配置java环境变量 转过几个,这个最详细和靠谱
- 深入理解ThreadLocal(个人感觉这个是比较靠谱的)
- linux配置java环境变量 转过几个,这个最详细和靠谱
- hdu 3899 树形dp 这个题目貌似不难,可是好像托了很久
- admob更新, 新版本需要替换AdUnitId这个key, 其他貌似不变
- 无人机这个创业方向靠谱吗?值得投资吗?
- 切克闹貌似这样适配iphone5
- 《这个历史挺靠谱·上·袁腾飞讲中国史》读后感
- 听朋友介绍了QT,闲时下载看了看,貌似不错,总有点儿BC感觉,呵呵,这个是VS2008+QT的安装,献给有兴趣的朋友!
- 【很逗,很经典】【与靠谱IT男的浪漫闪婚记】——转个很可爱的帖子,貌似男女猪脚是咱IT人士呢
- 貌似用这个可以把很多语言转为 javascript
- 这个“06年最希望看到的6个中文网络服务”是靠谱的
- 一些经验,用来鉴别不太靠谱的公司或工作(面试是双向的,是你最好的了解这个公司的机会)
- UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。
- 这个“06年最希望看到的6个中文网络服务”是靠谱的
- 貌似这个博客有个Bug~~呵呵。
- 趣谈12星座 这个貌似挺准的