常见的度量单位
> in、px、pt、ppi、dpi、dp、sp
1. in
(inch) 英寸(手机斜边长度),现实中我们提到4英寸手机或者5.5英寸大屏手机,而这个尺寸是用户真正感受到的物理大小。
2. px
(pixel) pixel即像素,是屏幕上显示数据的最基本的点。px是就是一张图片中最小的点,一张位图就是由这些点构成的。px是一个点,它不是自然界的长度单位,谁能说出一个“点”有多长多大么?可以画的很小,也可以很大。如果点很小,那画面就清晰,我们称它为“分辨率高”,反之,就是“分辨率低”。所以,“点”的大小是会“变”的,也称为“相对长度”。
3. pt
(point) point即像点,pt是印刷行业常用单位,等于1/72英寸。pt全称为point,但中文不叫“点”,查金山词霸可以看到,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸。所以它是一个自然界标准的长度单位,也称为“绝对长度”。因此就有这样的说法,pixel是相对大小,而point是绝对大小。
4. ppi
(pixels per inch) 图像分辨率 (每英寸上有几个像素)
5. dpi
(dots per inch) 打印分辨率 (每英寸上有几个像点)
6. dp和dip
Android中,dp是Density-independent Pixels简写,而dip则是Density Independent Pixels,实际上指的是一个概念,都是Android的单位。在文档More Resource Types中有描述。
(density-independent pixels) 以160dpi屏幕为标准,则1dp=1px,dp和px的换算公式:
例1:
dpi = sqrt(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
iphone5的ppi是多少?dpi=sqrt(1136px² + 640px²)/4 in=326dpi(视网膜Retina屏)
例2:
手机型号:G700
手机分辨率:1280*720 (注:手机两个直角边上分别放置了1280及720个像素)
手机尺寸大小:5英寸(手机斜边长度)
假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
计算结果:sqrt(1280*1280+720*720)/5 ≈ 293.72dpi
根据google官方文档说明得出,当前手机最接近320dpi,则将其归纳在xhdpi手机范围内,即1dp=2px;
例3:
手机型号:模拟器
手机分辨率:800*480(注:手机两个直角边上分别放置了800及480个像素)
手机尺寸大小:3.7英寸(手机斜边大小)
假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
计算结果:sqrt(800*800+480*480)/3.7 ≈ 252.15dpi
根据google官方文档(图1-1)得出,当前手机接近240dpi,则将其归纳在hdpi手机范围内,即1dp=1.5px。
7. sp
(Scale-independent pixels) 它是安卓的字体单位,以160dpi屏幕为标准,当字体大小为 100%时, 1sp=1px。
sp 与 px 的换算公式:sp*dpi/160 = px
安卓中使用dp和sp的原因
是不是看起来dp和sp一样,在Android设计原则中,有提到这两个单位,他建议文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。
例如:textSize="16sp"、layout_width="60dp"。
为什么要把sp和dp代替px?
最简单的原因是他们不会因为dpi的变化而变化,在相同物理尺寸和不同dpi下,他们呈现的高度大小是相同。也就是说更接近物理呈现,而px则不行。
android代码适配
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
public class second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Constant constant = new Constant();
String tag = "ziru";
// 获取封装当前手机屏幕信息对象,用于存放宽高值
DisplayMetrics metrics = new DisplayMetrics();
// 给当前屏幕设置宽高
getWindowManager().getDefaultDisplay().getMetrics(metrics);
// 获取高度
constant.srceenHeight = metrics.heightPixels;
// 获取宽度
constant.srceenWidth = metrics.widthPixels;
//计算1dp等于几px? 例如: 1280x720的5英寸手机, 1dp=2px
float density = this.getResources().getDisplayMetrics().density;
Log.i(tag, "Constant.srceenHeight = " + constant.srceenHeight);
Log.i(tag, "Constant.srceenWidth = " + constant.srceenWidth);
Log.i(tag, "density = " + density);
}
public class Constant {
public int srceenHeight;
public int srceenWidth;
}
}
px和sp互转,px和dp互转工具类
import android.content.Context;
public class DisplayUtils {
/**
* px转dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* dp转px
*/
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
/**
* px转sp
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* sp转px
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
本文详细介绍了Android开发中常用的度量单位,包括in、px、pt、ppi、dpi、dp、sp等,并解释了它们之间的区别及在实际应用中的作用。通过实例计算,帮助开发者更好地理解和应用这些单位,确保在不同设备上实现一致的UI效果。
9059

被折叠的 条评论
为什么被折叠?



