`
fantaxy025025
  • 浏览: 1245741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Android多分辨率适配-长度单位和转换计算-多分辨率适配

 
阅读更多

 

相对习惯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(感谢作者!!)

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics