android适配


如何将一个应用程序适配在不同的手机上,虽然这不算是一个技术问题,但是对于刚刚做屏幕的开发人员来说,还真不是一件多么简单的事情。

首先:你需要在AndroidManifest.xml文件的<manifest>元素如下添加子元素

<supports-screensandroid:largeScreens="true"

android:normalScreens="true"android:anyDensity="true"

android:smallScreens="true"></supports-screens>

    名如其意,以上是为我们的屏幕设置多分辨率支持(更准确的说是适配大、中、小三种密度)。android:anyDensity="true"这一句对整个的屏幕都起着十分重要的作用,值为true,我们的应用程序当安装在不同密度的手机上时,程序会分别加载hdpi,mdpi,ldpi文件夹中的资源。

相反,如果值设置为false,即使我们在hdpi,mdpi,ldpi文件夹下拥有同一种资源,那么应用也不会自动地去相应文件夹下寻找资源,这种情况都是出现在高密度,以及低密度的手机上,比如说一部240×320像素的手机,如果设置android:anyDensity="false"Android系统会将240 x 320(低密度)转换为320×480(中密度),这样的话,应用就会在小密度手机上加载mdpi文件中的资源。

2.细心的人会发现自android2.0开始之后drawable文件被三个文件夹drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹所取代,有些编程人员为了让应用程序默认地加载某些图片,他们会特意地去在android2.0之后的应用程序中重新创建drawable文件夹,其实这样做完全没有必要,通过第一段的分析我们得知,android:anyDensity="false"则应用会将大小密度转变成中密度,从而去加载mdpi中的资源。这里同样,当android:anyDensity="false"则应用会去加载mdpi中的资源。

总结一下:

第一:android:anyDensity="true"系统会依据屏幕密度,自动去找对应的文件夹

第二:android:anyDensity="false",

(1) 如果drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹中有同一张图片资源的不同密度表示,那么系统会去加载drawable_mdpi文件夹中的资源

(2) 如果drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载drawable-hdpi中的资源。

(3) 如果drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有对应的图片资源,那么系统会加载drawable-mdpi文件夹中的资源

3. 注意上图各种文件夹的不同表示。

drawable-hdpi 该图片即适用于横屏,也适用于竖屏

drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹中的资源

drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源

3. 有时候会根据需要在代码中动态地设置某个值,比如地图,地图的pin和地图的地址提示框的相对偏移量在不同密度的手机上是不同的。这时候可以通过以下方法求出屏幕密度:

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);

int densityDpi = metric.densityDpi; //屏幕密度DPI120 / 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厂商修改的完全一致。

5. 国际化问题.

有时候在xml中设置了相应的语言,但是为什么当我们更改语言之后,UI显示仍然不起作用?

不要怀疑是系统出了问题,这与我们在代码中引用values/string.xml中字符串的方式有关。

错误的方式:

1. 声明全局变量 private static String tempStr;

2. 在onCreate方法中对该变量赋值 tempStr = context.getString(R.string.test);

3. 在更新UI的方法(非onCreate方法)中引用该变量。 textView.setText(tempStr);

原因是由于,当修改本地语言时,onCreate不会再被执行一遍. 变量tempStr 依然会使用页面刚启动时加载的默认英语。


正确的方式:

直接进行第三步:textView.setText(context.getString(R.string.test));


 

 

 

 

有些屏幕分辨率并不在下面的列表上,但系统仍会把它们归入下列的某一个类型中。

低密度(120),ldpi
中密度(160),mdpi
高密度(240),hdpi


小屏幕
·QVGA(240×320),2.6~3.0寸


普通屏幕
·WQVGA(240×400),3.2~3.5寸
·FWQVGA(240×432),3.5~3.8寸
·HVGA(320×480),3.0~3.5寸
·WVGA(480×800),3.3~4.0寸
·FWVGA(480×854),3.5~4.0寸
大屏幕

·WVGA(480×800),4.8~5.5寸
·FWVGA(480×854),5.0~5.8寸

 所以只能在图片上做文章,程序肯定是不能一一进行控制的.

 

图1: 有道云笔记Android 1.2.0引导画面

14


图2:有道云笔记Android 2.0.0引导画面

引导页1_demo1

二、实现方式之一:底色配合图片缩放


需要知道的是,同一DPI的设备也有不同的分辨率,比如Hdpi最常见的就有480×800和480×854的分辨率,还有其他的,比如480×640、600×1024….

因此,想对不同dpi做一种分辨率的方法,会存在问题。

我尝试用图来说明一下一张图片,如果不做处理在不同机器和不同分辨率上的显示样式:

以Galaxy Nexus为例,屏幕分辨率为720×1280,状态栏为50px,下方虚拟键盘栏为96px,所以实际中间图片大小为720×1134


2.1 在不同分辨率下的显示样式

让我们模拟下此720×1134的引导图在720×1280分辨率的设备上的显示样式如下图:

图A:720×1134的引导图在720×1280设备的显示样式

clipboard

当我们在一台480×800分辨率的设备上显示时,图片会缩小为480px的宽度显示,此时高度对应会等比缩小为756px显示,假设此时状态栏标准高度为38px,则会空余16px的空间。如果我们设置背景颜色为红色,则此时显示状态如下图:


图B:720×1134的引导图在480×800设备的显示样式

clipboard[1]

同理,当我们在一台320×480分辨率的设备上显示时,假设此时状态栏标准高度为25px,等比缩放后,图片会缩小为455px(480-25)的高度显示,此时宽度对应会等比缩小为289px显示,则会空余31px的空间。如果我们设置背景颜色为红色,则此时显示状态如下图:

图C:720×1134的引导图在320×480设备的显示样式

clipboard[2]

不再继续多举例了。

2.2 适配方案

从上述的例子来看,大图自动缩放后,最大的问题是上下、或左右会留出一些无法填充的位置。

所以,在边缘为纯色的情况下,我们只需要将背景填充为和边缘颜色一样的色值即可。

而且,我们只需要准备较大分辨率的一套,这样可以更好的保证在不同解析度设备上的效果。

2.3 缺陷

下图是在240×320的ldpi设备上的显示效果,如果仔细看,可以看到左右两侧竖向的颜色和中间部分的颜色有一些不一致。

原因还不确定,暂时未有明确结论,猜测可能和android的图像缩小显示机制有关系。

clipboard[3]

3.4 示例

(1)  有道云笔记Android 2.0.0的引导画面切图

引导页1

(2)  Android 2.0.0中的适配

√  图片的周边保证是纯色的,这样才能有效的进行不同分辨率的适配。

√  指定了720×1280的机器为标准参照设备,切出去除了虚拟键盘和状态栏的部分

√  设定引导界面的背景色为和边缘色一致的颜色

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值