zoukankan      html  css  js  c++  java
  • 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

    ….类推

  • 相关阅读:
    20151010 C# 第一篇 变量类型
    20151009 C# 第一篇 程序编写规范
    20151009 C# 第一篇 基础知识
    VS 控件命名规范
    Replace Pioneer 续用2
    bcb安装控件方法汇总
    Unresolved external 'LresultFromObject'
    Form居中显示
    C++Builder 中 Enter键或者Tab键无效
    解决Ubuntu鼠标右键无反应
  • 原文地址:https://www.cnblogs.com/common1140/p/3998929.html
Copyright © 2011-2022 走看看