您的位置:首页 > 移动开发 > Android开发

Android 手机屏幕分辨率

2011-09-21 10:24 309 查看
http://www.cnmsdn.com/html/201106/1308830506ID10042.html

对于准备换新手机的朋友,可能会参考一些参数,比如手机屏幕的分辨率。今天就来看看手机屏幕VGA QVGA HVGA WVGA区别,一般手机液晶屏幕都是TFT材质,VGA WVGA QVGA HVGE XGA只是表示屏幕分辨率只,是个代号和材质没关系。

VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素;  

分辨率对照表:(分辨率一般都是将大的数写在前面)

  代号 分辨率 代号 分辨率

  QVGA 320*240像素 WQVGA 400*240像素

  HVGA 480*320像素 VGA 640*480像素

  WVGA 800*480像素 XGA 1024*480像素

  QVGA 即Quarter VGA。顾名思义即VGA的四分之一尺寸

  HVGA (Half-size VGA),即VGA(640*480)的一半

WVGA:Wide Video Graphics Array;即:扩大的VGA,分辨率为800×480像素;

WQVGA:Wide Quarter VGA;即:扩大的QVGA,分辨率比QVGA高,比VGA低,一般是:400×240,480×272;

  VGA 和XGA(Extended Graphics Array) 详情见百度百科

  他们和屏幕大小也没关系,比如 诺基亚N95和诺基亚E71都是QVGA 320*240,N95是2.6英寸 N95 8GB为2.8英寸,而E71是2.36英寸

  再看,苹果iphone是HVGA 480*320 3.5英寸 而G3(HTC hero)也是HVGA480*320
屏幕为3.2英寸。

  当然同样的分辨率 屏幕越小 显示越细腻!

  pt, px, DPI: 关于长度单位的误解

  February 24th 2006 Posted to CSS, Browsers, Typography

  在印刷排版中,“point”是一个绝对的单位,它等于 1/72 英寸,可以用尺子丈量的,物理的英寸。但在 CSS 中 pt 的含义却非如此,例如我们指定一个字体是 9pt,我们会以为按照 CSS 规范,它等于:

  9 * 1/72 = 1/8 inch

  这是一个误解,因为我们的显示器被分割为了一个个的像素,单个像素只能有一种颜色 (为了简化,这里暂不讨论次像素反锯齿技术),要在屏幕上显示,必须先把以 pt 为单位的长度转换为以像素为单位的长度,这个转换的媒介,就是 DPI (事实上,这里的所谓的 DPI,是操作系统和浏览器中使用的术语,即为 PPI, pixels per inch,和扫描仪、打印机、数码相机中的 DPI 是不同的概念)。

  例如,无论在哪个操作系统中,Firefox 浏览器默认的 DPI 都是 96,那么实际上 9pt = 9 * 1/72 * 96 = 12px。

  所以,虽然“DPI”中的“I”和“1pt 等于 1/72 inch”中的“inch”,都不代表物理上的英寸,但这两个单位互相之间是相等的,也就在相乘中约掉了。

  那么,真实的物理长度怎么计算呢?请拿出一把尺子,丈量你的显示器的可见宽度 (我这里是 11.2992 英寸),除以横向分辨率 (我这里是 1024像素),得到的就是每个像素的物理长度。

  现在我们可以回答这样一个问题,网页上 9pt 的字体究竟占用了多宽的空间?答案是:

  9 * 1/72 * 96 * 11.2992 / 1024 = 0.1324 英寸 = 0.3363 厘米。

  手机屏幕的2.1英寸只手机的矩形屏幕对角线的长度,用对角线长度来衡量手机屏幕的大小,当然英寸也能换算成厘米一英寸,也就是25.4毫米。

  1像素

  简单地说,一个像素可以看作一个点,这样的点是有尺寸有面积的,尺寸单位可以与厘米互化,公式我记不清了。照片就是由许多这样的点组成的。每个点记录对应的色彩信息。

  30万像素就是分辨率640*480=307200个点的合成,这里的一个点就是一个指一个像素

  2分辨率

  分辨率。单说分辨率是不能反映出图片品质的,分辨率的意思是,单位尺寸的像素数。通常说的是每英寸的像素数,单位是dpi。例如分辨率是72dpi,也就是说每英寸有72个像素.相当于一条直线由无数点组成一样,这里就一英寸的线段由72个相素组成.

  像素密度:像素总数/屏幕面积

  android密度:160DPI密度系数是1

px:是屏幕的像素点

in:英寸

mm:毫米

pt:磅,1/72 英寸

dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px

dip:等同于dp

sp:同dp相似,但还会根据用户的字体大小偏好来缩放。

建议使用sp作为文本的单位,其它用dip

然后是我自己的理解:

Android的屏幕密度是以160为基准的,

屏幕密度(densityDpi)为160时, 是将一英寸分为160份, 每一份是1像素. 如果屏幕密度(densityDpi)为240时, 是将一英寸分为240份, 每一份是1像素.
1英寸/160(机器x) = 1英寸/240(机器y) = 1px

打个比方, 一个三英寸的显示屏幕的机器, 如果屏幕密度(densityDpi)为160, 即密度比(density)1.0时, 画一条160dip和160px的线条, 两个都是1英寸. 可如果还是三英寸的屏幕,如果屏幕密度(densityDpi)变为320, 即密度比(density)2.0时,1英寸有320像素了, 此时160px显示就是半英寸.
160dip显示还是1英寸, 因为 1dip = 1px * density .

可是你有没有注意到, 同样宽的屏幕, 比如3英寸, 如果density 是1.0的话, 分辨率就是480dip*x或480px,*x 如果还是3英寸的,
density 是1.5的话 , 分辨率就是480*1.5 = 720px*x或480dip*x.
(这里的x代表屏幕的高度). 如果同样是240dip, 在两款机器上显示都是一半的长度, 这样就保证了比例. 这样的话如果是480分辨率和720分辨率的话, 可以采用同一个布局文件了.

又但可是, 我见过的机器只有320*240(0.75) , 480*320(1.0) , 800*480(1.5), 854*480(1.5) ,如果是480 和 800 两个版本, 同一条线480dip
, 480显示全屏, 800则显示 480 / (800 / 1.5) 屏 . 其中800/1.5是屏幕的总dip
. 我们平时说的分辨率都是以像素px为单位的.

由此可见, 就算是用dip, 也不能保证不同分辨率的机器的布局比例完全一样. 但还是有好处的. 因为如果是用px的话, 有些时候一些布局直接跑到了屏幕外边, 调试起来很麻烦.

还有, google代码里边所用的单位都是以px为默认单位的.

apk的资源包中,当屏幕density=240时使用hdpi标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源。

在每英寸160点的显示器上,1dp = 1px。

下面是几种不同单位的相互转换.

public static int dip2px(Context context, float dipValue){

final float scale = context.getResources().getDisplayMetrics().density;

return (int)(dipValue * scale + 0.5f);

}

public static int px2dip(Context context, float pxValue){

final float scale = context.getResource().getDisplayMetrics().density;

return (int)(pxValue / scale + 0.5f);

}

public static int dip2px(Context context, float dipValue){

final float scale = context.getResources().getDisplayMetrics().density;

return (int)(dipValue * scale + 0.5f);

}

public static int px2dip(Context context, float pxValue){

final float scale = context.getResource().getDisplayMetrics().density;

return (int)(pxValue / scale + 0.5f);

}

下面说下如何获取分辨率:

在一个Activity的onCreate方法中,写入如下代码:

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int width = metric.widthPixels; // 屏幕宽度(像素)

int height = metric.heightPixels; // 屏幕高度(像素)

float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi; // 屏幕密度DPI(120
/ 160 / 240)

这还是挺简单的, 可是你有没有在800*480的机器上试过, 是不是得到的宽度是533 ? 因为android刚开始时默认的density是1.0 , 此时你可以再manifest.xml中加入

1.uses-sdk节点, <uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的机器不能安装你的apk了.

2.supports-screens 节点.

<supports-screens

android:smallScreens="true"

android:normalScreens="true"

android:largeScreens="true"

android:resizeable="true"

android:anyDensity="true" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: