相对习惯web的px,手机上面的屏幕适配和长度单位都比较多。

以前也没有仔细留意这些,我自己的手机是多少从没有关心过。

这回做一个全面的调查,一般目标都是达到 实用导向的 专家级别。

使用的单位:

在Android应用的开发过程中,我们往往需要设置组件,字体等尺寸,这个时候就需要制定计量单位。在Android中使用到的计量单位主要有px, pt, dp, dip, sp等,这些计量单位表示什么尺寸,之间有何区别?

px :像素

in :英寸inch
mm :毫米
pt :磅,1/72 英寸
dp :(dip, Desity-independent pixel):密度无关像素,一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px

dip :dpi(dots per inch),即像素密度,每英寸面积上存在多少个像素。

sp :(与刻度无关的像素),与dp类似,但是可以根据用户的字体大小首选项进行缩放。建议sp作为文本的单位

基本概念

屏幕大小:以屏幕对角线的物理长度来衡量屏幕的大小

分辨率:屏幕中所有物理像素点数。如320x480,就表示宽方向有320个像素,高方向有480个像素,整个屏幕有153,600个像素。

屏幕密度:dpi(dots per inch),即像素密度,每英寸面积上存在多少个像素。160dpi表示单位面积上有160个像素,240dpi表示单位面积上有240个像素。屏幕的密度是由分辨率和屏幕大小(物理尺寸)决定的,320x480的分辨率在3寸的屏幕上与6寸的屏幕上密度是不同的。

dp(dip, Desity-independent pixel):密度无关像素,在Android中经常使用。android将160dp作为一个标准(即单位面积上有160个像素点时),此时1dp=1px;当将1dp放到240dp的屏幕上去时,android就会自动将1dp调整为1.5px的大小。而在美工给出的高保真一般是px,要根据给出的高保真的密度,换算到dp,公式:

px = dp *(dpi/ 160)

android将所有的密度泛化为:ldpi, mdpi, hdpi。

将屏幕大小泛化为small, normal, large, xlarge(extra large)。

实际的例子:

华为荣耀4核的参数如下(from jd):

华为手机:

屏幕尺寸4.5英寸

分辨率1280×720 HD高清,326PPI

(看看,这里用的326PPI其实就是pdi,Pix Per Inch -- ppi,google居然这么写Dots Per Inch -- dpi)

一般手机就只说屏幕的尺寸,即对角线的英寸数值,不说屏幕的长和宽。

如果我能知道场合宽的比例,即根据 长*宽=面积( l*w=s ),可以算出来长和宽。

长和宽的比例,其实手机的参数也写明了:

分辨率1280×720

根据这个也可以看出来长宽比(因为像素是等大小的,根据等比例可以推知:长宽的像素个数比即长宽比)

我又查了查业界的大概情况:能手机的屏幕一般的长宽比例是多少呢?

一般有16:9和16:10两种。16:9比如LG 2X、LG LTE等,分辨率为800*480、1280*720等;16:10比如iphone4、iphone4S、魅族M9、魅族MX等,分辨率为960*540。我用的是16:9的LG LTE,这种比例好处是看电影比较好,一般的16:9电影可以满屏全比例播放;缺点就是没有16:10的手机看上去好看,会显得比较长一些。

知道了长度,长宽比,像素密度,那么,来算算pdi==ppi

屏幕尺寸4.5英寸

分辨率1280×720 HD高清

怎么计算简单呢?需要去计算屏幕以inch为单位的面积么?

根据等比原则,只要计算对角线的比例既可以了。

分辨率的对角线,(我的脑子还是有点儿问题,居然不能转换ruby的平方到平方根):

1.9.3p194 :007 > ( (1280**2) + (720**2) ) ** (1/2.0)

=> 1468.6047800548656

对角线的比例,即面积比:

1.9.3p194 :008 > ( (1280**2) + (720**2) ) ** (1/2.0) / 4.5

=> 326.35661778997013

可以看出这里的326PPI 是四舍五入的结果。yea!

即单位inch的面积上有326这么多的像素。

实际的计算

实际开发android中或者cocos2d等游戏的时候就得关注此等计算了。

dp:android将160dp作为一个标准(即单位面积上有160个像素点时),此时作为一个单位比例,即1dp,此时1dp=1px

比如如果用上面的华为手机,则pd设置多少呢?

326.0ppi / (160ppi/pd) = 2.03pd

假设开发时即用单位屏幕的avd开发,则设置为1pd,当放入华为此款手机时,1dp将自动拉升为2.03px

这样的好处:不用改程序了,可以自适应。

dp与px换算公式:

pixs =dips * (densityDpi/160).
dips=(pixs*160)/densityDpi

dp与px转换的方法:

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);
}

遗留问题:

上面只是解决了自动拉伸,但有时候,拉伸是有问题的,比如一个按钮4角时圆形而不是方形,如果拉伸就会出现问题:角上的边缘线也拉伸了,其实我只想拉伸内部。

解决方法:9妹。

http://www.eoeandroid.com/thread-79604-1-1.html

http://www.eoeandroid.com/thread-79606-1-1.html

参考:

http://zhidao.baidu.com/question/370403611.html

http://item.jd.com/755374.html

http://blog.sina.com.cn/s/blog_4c0706560100uc4d.html

http://l540151663.iteye.com/blog/1512733(不错!!)

Android多分辨率适配此篇文章很好!!

http://www.uuton.com/post/3f493_22910a(感谢作者!!)

更多相关文章

  1. [Android]度量单位dip介绍
  2. Android(安卓)LayoutInflater原理解析
  3. Android推荐使用的尺寸单位dp和sp
  4. Intent 全面理解
  5. [置顶] android Intent的Action、Category属性
  6. Android(安卓)UI--Shape和Selector
  7. Android(安卓)传感器--光照传感器详解及使用
  8. 使用chrome调试android前端页面
  9. 面试又来了

随机推荐

  1. Mac IDA debug android exec program
  2. Android 知识体系
  3. DateFormatUtil,好用的日期格式化工具类
  4. webview和Android交互
  5. Android热更新实现原理浅析
  6. Android Studio真机调试,数据库sqllite时,M
  7. Android第十五课 Jni自带的iconv库不支持
  8. Android常用高质量框架
  9. android使用WebView显示sdcard的html文件
  10. android 设置背景图片