android最佳实践之设备兼容性

由于不同手机的尺寸大小,屏幕分辨率可能存在差异。在开发应用的时候,你或许遇到过这些的问题:

1, 为什么图片在另外的手机上显示的时候变小了,又或是缩小了?

2, 为什么在layout中定义好的格局在另外的手机上变形了?

3, 为什么自己自定义的控件尺寸显示不正常了?

。。。。。。。。。。。。。。。。

这些都是android中比较常见的设备兼容性相关的问题,其实解决这类问题也不难,只要掌握了一些基本概念和android内部处理兼容性问的机制,这些问题都可以迎刃而解。

下边收集了一些关于尺寸兼容性问题的一些基本知识和一些best practices, 希望对大家能有所帮助

1,屏幕尺寸大小与密度参考值:

 

注解:1 inch = 2.5cm

密度基线: 160dpi

2, 屏幕尺寸与密度对照表:

3,px 与 dp 在不同分辨率设备上的转换规则:

一, 假如设备的尺寸是2英寸的,分辨率是320,那边它的密度为160dpi,也就是基本参考线。这时:1px=1dp=1sp.

二, 假如设备的尺寸是2英寸,分辨率是480, 那么它的密度是240/dp.这时:1.5px=1dp=1sp

换算规则px = dp(dpi/160).

 

这个可以解析为什么用dp作为长度单位时,即使屏幕分辨率发生变化,在不同的设备上显示的物理长度能保持一致。而用px作为单位时,在高分辨率的设备上图像变小,在低分辨率的设备上图像变大。

 

4,使用wrap_content, fill_parent, 或者 dp 来定义layout的尺寸大小。

使用dp来定义组件的尺寸的好处是:系统会根据设备dpi自动转换尺寸的大小。举个列子,在密度为160dpi的机器上,假如你定义组件的尺寸是100dp,那么显示的实际大小就是100px。而在密度为240的机器上,系统会把它显示成px=100 * (240/160) px= 150px大小的尺寸。通过这种转换,可以达到在不同分辨率的设备上,对于同一个组件,显示的物理尺寸是相同的,不会出现变大或者变小的情况。

 

5,不同密度设备对应图像文件的最佳比例。

对于四种密度low-dpi, medium-dpi, high-dpi, extra high-hdpi的设备,在指定一个相同的图像文件时,分配给各种密度的图像文件的尺寸应该符合以下比例:3:4:6:9. 也就是要符合密度比例(120:160:240:360).

举个列子,假如我们要在一个密度为160dpi的设备上使用到一个48 * 48的图像文件。那么对于其它密度的设备,我们要准备的图像文件分别是:

low-density (120dpi) : 36×36

medium-density(160dpi): 48×48

high-density (240dpi) : 72×72

high-density (360dpi): 96×96

 

6,在需要的情况下,为每种尺寸的设备提供指定的layout文件。

res/layout/my_layout.xml             // layout for normal screen size (“default”)

res/layout-small/my_layout.xml       // layout for small screen size

res/layout-large/my_layout.xml       // layout for large screen size

res/layout-xlarge/my_layout.xml      // layout for extra large screen size

res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

 

 

7, 在需要的情况下,为每种密度的设备提供不同的图像文件.

res/drawable-mdpi/my_icon.png        // bitmap for medium density

res/drawable-hdpi/my_icon.png        // bitmap for high density

res/drawable-xhdpi/my_icon.png       // bitmap for extra high density

 

8,不在layout文件中使用px。

因为使用px后会在分辨率不同的机器上显示成不同的物理尺寸。

 

9,不使用absoluteLayout 布局。

因为绝对布局需要指定绝对偏移量,在尺寸不同的机器上,可能出现问题。

 

 

,10,如何让我们自己写的控件可以配置长度和自适应所有设备:

在所有自定义控件中,都不要硬编码长度,宽度等尺寸;应该先根据基线160dpi调式得到控件在标准基线下控件的最佳值,假如设为width。然后通过density = getResources().getDisplayMetrics().density 获取当前设备相对于基线的缩放值,然后得到一个最佳值value = width * density. 在用这个值去绘制控件的UI。这样我们就可以在配置文件中随时改动控件的大小。

 

注解:density = getResources().getDisplayMetrics().density

这个值在不同密度的设备中返回不同的值:

160dpi:1

240dpi: 1.5

120dpi: 0.75

….类推

 

posted @ 2014-09-28 20:34  钟汉文  阅读(293)  评论(0编辑  收藏  举报