Android分辨率适配

Android的分辨率适配问题一直是Android所让人诟病的主要问题,这里参考了官方的开发文档和实际开发中的一些处理分辨率的技巧来和大家交流一下。

官方的关于分辨率适配的文档“SupportingMultiple Screens”

Overview of Screens Support

  • Screen size:屏幕尺寸
  • Screen density:屏幕密度
  • Orientation:方向
  • Resolution:分辨率
  • Density-independent pixel (dp or dip):与像素类似的一个概念,是组成画面的最小颗粒度的单位,相当于160dpi屏幕上的一个物理像素点

Range of screens supported

Android从1.6(API Level 4)开始支持多分辨率适配,对屏幕尺寸和密度进行了划分:

* 屏幕尺寸:small,normal,large,xlarge

* 屏幕密度:ldpi(low),mdpi(medium),hdpi(high),xhdpi(extra high)

这里尺寸和密度的基准是基于第一台Android机T-Mobile G1(HVGA Screen),所以为了减少产品的适配成本,只需要考虑在generailized size/density上的适配性。

在设计实际的Layout的时候,应该用的单位是dp,这样就可以避免因为屏幕的dpi不同所造成的影响,最典型的例子就是苹果的retina屏幕。

  • xlarge: at least 960dp x 720dp
  • large: at least 640dp x 480dp
  • normal: at least 470dp x 320dp
  • small: at least 426dp x 320dp

px = dp * (dpi / 160)

例如一个240dpi的屏幕,1dp就相当于1.5个像素

px,dpi,dp,dip,sp

度量单位 解释
px(pixel像素) 像素单位
dpi(dots per inch像素密度) 每英寸的像素数,假设设备的分辨率是320 * 240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160
dp(density密度) 每平凡英寸的像素数Density=Resolution/Screen size
dip(Device-independent pixel,设备独立像素) 和dp相同,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip
sp(ScaledPixels放大像素) 主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
屏幕 密度 dpi 分辨率 匹配分组
QVGA density=0.75 densityDpi=120 QVGA(240 * 320) ldpi
HVGA density=1.0 densityDpi=160 HVGA(320 * 480) mdpi
VGA density=1.0 densityDpi=160 VGA(480 * 640) mdpi
WVGA density=1.5 densityDpi=240 WVGA(480 * 800) hdpi
WQVGA density=2.0 densityDpi=120 WQVGA(240*400) xhdpi

为什么在设计UI的时候要考虑dpi

这里举一个例子,在没有考虑dpi的情况下在界面上放一个32 * 32px大小的按钮,那么在同样是3.7寸,分辨率分别是480 * 320、600 * 480、800 * 600的手机的显示效果如下:

由图可以看出,由于设备的dpi增大,1px在设备上对应的物理长度减少,最终的显示效果是组件看起来变小了。

用dpi来作为界面的尺寸标注单位

将控件的尺寸标注为32dip * 32dip,得到的显示效果:

可以看出显示的效果好了很多。Android默认是使用density来匹配资源文件,而不是屏幕大小,同时图片分辨率和屏幕不匹配时,系统为需要大量的额外内存来对图像进行拉伸和缩放,这些额外的开销,会降低程序运行的效率。最关健是可能会引起内存溢出的异常,这是由android内存回收机制引起,对于大量图片使用的情况,发生的概率相当的高,目前没有有效办法解决。

获取density和dip

手机density和DIP可以使用以下方法获取,两种方法,一种是getWindowManager获取,一种是通过getResources的获取,两种结果是一样的,但因为某些原因,可能会有差异,有些手机厂商会修改API,有些厂商无良厂商会让低端屏故意显示高端的数据,如果你获取的屏幕数据不太准确,也不必太过在意:

void getDefaultDisplayScreenSize()
{
    DisplayMetrics dm = newDisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int screenWidthDip = dm.widthPixels;// 屏幕宽(dip,如:320dip)
    int screenHeightDip = dm.heightPixels;// 屏幕宽(dip,如:533dip)

    float density= dm.density;// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
    int densityDPI= dm.densityDpi;// 屏幕密度(每寸像素:120/160/240/320)

    float xdpi= dm.xdpi;
    float ydpi= dm.ydpi;

    w= dm.widthPixels;// 屏幕宽(px,如:480px)
    h= dm.heightPixels;// 屏幕高(px,如:800px)
}

void getDefaultDisplayScreenDensityDPI()
{
    DisplayMetricsdm = newDisplayMetrics();
    getResources().getDisplayMetrics();

    int screenWidthDip = dm.widthPixels;// 屏幕宽(dip,如:320dip)
    int screenHeightDip = dm.heightPixels;// 屏幕宽(dip,如:533dip)

    float density= dm.density;// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
    int densityDPI= dm.densityDpi;// 屏幕密度(每寸像素:120/160/240/320)

    float xdpi= dm.xdpi;
    float ydpi= dm.ydpi;
}

屏幕适配的流程

1、声明应用兼容的屏幕尺寸

在manifest文件中用来声明应用兼容的屏幕尺寸。这样可以让设备判断是否采用屏幕兼容性模式(Screen Compatibility Mode)来运行应用。

2、为不同的屏幕尺寸提供不同的Layout布局

对面的布局文件分别放在layout-small,layout-normal,layout-large,layout-xlarge文件夹下。

3、为不同的dpi提供不同的图片资源

如果是用dip来标记组件的大小,在绘制图片的时候,会将以像素尺寸度量大小的图片资源做缩放操作来最终适应屏幕中组件的大小,很容易产生显示模糊、圆角变形等问题,所以会针对不同dpi准备不同的图片资源。如果为不同dpi设备准备了不同的图片资源,android参考文档中建议以3:4:6:8的比例来依次做ldpi,mdpi,hdpi和xhdpi上的资源,android官方有关参考文档“IconDesign Guidelines”

时间: 2024-08-03 06:28:30

Android分辨率适配的相关文章

Android分辨率适配心得

关于Android分辨率适配,这个是Android开发很头疼的一个问题,也需要花费相当一部分开发时间处理的一个问题,往往一个界面怎么适配就得想半天,特别是新手,也经常有人问我是怎么适配分辨率的,我也不能几句话说清楚,自己也在研究中. 其实,我觉得分辨率适配,不只是研发单方面的事情,与产品.UI设计师也有很大关联.首先产品必须了解一点Android布局以及分辨率适配的知识,设计的界面布局可以尽量简洁一点,效果图界面显示效果尽量稀疏一点,考虑到各个尺寸的手机每个界面的显示情况.其次,UI设计师设计时

android 分辨率适配

Android设备的碎片化众所周知,分辨率.长宽比千变万化,让设计师与开发者头疼不已.由于工作需要,可乐橙对其简略分析了一下,希望对自己与广大设计师和开发者们的工作有帮助. AD: Android设备的碎片化众所周知,分辨率.长宽比千变万化,让设计师与开发者头疼不已.由于工作需要,可乐橙对其简略分析了一下,希望对自己与广大设计师和开发者们的工作有帮助.

【Android】Android中不同手机分辨率适配问题

在项目开发的过程中,同一个布局对应不同的手机会显示出不同的效果.导致这个现象产生的原因是不同手机的分辨率不同.在android sdk提供的帮助文档中,我们可以看到各种手机的分辨率和对应的屏大小.QVGA (240x320),WQVGA400(240x400),WQVGA432 (240x432),HVGA (320x480),WVGA800 (480x800),WVGA854 (480x854). 目前android手机的分辨率大致就是帮助文档中描述的几种,我们可以用两种方式进行不同手机的适配

Android屏幕适配(分辨率适配)

对于刚接触Android的新人和刚走上Android技术岗位的开发者们来说,在熟悉了相关之后,在项目完成后,就会面临着一个重大的挑战,那么就是屏幕适配的问题.当然我们所说的屏幕适配指的是适配各种手机不同的分辨率.当然,如果你熟悉官网的话(网址:developer.android.com),那么你会发现官网上其实已经为你讲解了怎么做. 当然,首先你要知道如何打开网址,由于大天朝的制度,你想直接进Android开发者的官网,那么真的很难了.这时候就需要借助一点小工具了.比如:FreeDoor.海贝等

Android 屏幕适配问题分析

一.屏幕分辨率.大小及相关单位介绍 Android categorizes device screens using two general properties: size and density.There are four generalized sizes: small, normal, large, xlarge:And four generalized densities: low (ldpi 0.75), medium (mdpi 1.0 baseline), high (hdpi

android屏幕适配详解

android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如果是纯色背景,尽量使用android的shape 自定义. 5.如果需要在特定分辨率下适配,可以在res目录上新建layout

Android屏幕适配原理

大纲 1.android中res目录下的文件夹所对应屏幕尺寸 2.用dp表示尺寸的原理 3.对于720p尺寸的适配需要注意什么 4.ui切图按什么尺寸给最好 参考:http://www.360doc.com/content/12/0301/17/5087210_190881395.shtml 几个概念: 1) 屏幕密度(dpi) :dot per inch,即每英寸像素数. ldpi(120),mdpi(160),hdpi(240),xhdpi(320) 计算方法: 以480x854,4.0in

Android屏幕适配

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,h

【转】Android屏幕适配全攻略(最权威的官方适配指导)

Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习本文,对于Android的屏幕适配,你将有所收获! Android屏幕适配出现的原因 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 dpdipdpisppx mdpihdpixdpixxdpi 解决方案 支持各种屏幕尺寸 使用wrap_contentmatch_parentweight 使用相对布局