作者:炙天痕_953 | 来源:互联网 | 2024-11-16 14:57
dip(设备独立像素): 设备独立像素是一种与设备无关的单位,不同的设备会有不同的显示效果,主要取决于设备的硬件特性。为了支持不同分辨率的屏幕(如 WVGA、HVGA 和 QVGA),推荐使用 dip,因为它不依赖于具体的像素值。
px(像素): 像素是屏幕上的物理点,不同设备上的显示效果相同。例如,HVGA 屏幕的分辨率为 320x480 像素,这是最常用的单位之一。
pt(点): 点是一个标准的长度单位,1pt 等于 1/72 英寸,常用于印刷业。它在 Android 中的应用相对较少,但有时也会用到。
sp(可缩放像素): 可缩放像素主要用于字体显示,能够根据用户的字体大小偏好进行调整。Google 建议在 TextView 中使用 sp 作为字体大小的单位,因为 Android 默认也使用 sp 作为字体大小的单位。
在 Android 中,1pt 大约等于 2.22sp。如果 UI 设计中能够以 sp 为单位提供设计是最好的,如果没有 sp 的概念,开发人员可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为 300 像素的表单字段,列之间的间距为 5 像素,图标大小为 16x16 像素等。这种做法的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,用户界面会显得很小,甚至难以看清内容。为了解决这个问题,Android 支持以下几种与分辨率无关的度量单位:
- px(像素):屏幕上的点。
- in(英寸):长度单位。
- mm(毫米):长度单位。
- pt(点):1/72 英寸。
- dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸 160 点的显示器上,1dp = 1px。
- dip:与 dp 相同,多用于 Android 示例中。
- sp(与刻度无关的像素):与 dp 类似,但可以根据用户的字体大小首选项进行缩放。
分辨率是指整个屏幕的点数,例如 800x480,它是软件中的显示单位,以 px 为单位的点。density(密度)值表示每英寸有多少个显示点,与分辨率是两个不同的概念。在 APK 的资源包中:
- 当屏幕 density = 240 时,使用 hdpi 标签的资源。
- 当屏幕 density = 160 时,使用 mdpi 标签的资源。
- 当屏幕 density = 120 时,使用 ldpi 标签的资源。
一般情况下,Android 设置长度和宽度多用 dip,设置字体大小多用 sp。在屏幕密度为 160 时,1dp = 1px = 1dip,1pt = 160/72 sp,1pt = 1/72 英寸。当屏幕密度为 240 时,1dp = 1dip = 1.5px。为了使用户界面能够在各种显示器类型上正常显示,建议始终使用 sp 作为文字大小的单位,将 dip 作为其他元素的单位。此外,也可以考虑使用矢量图形,而不是位图。
以下是一个用于转换像素和密度的工具类:
import android.content.Context;
import android.util.DisplayMetrics;
/**
* 计算公式 pixels = dips * (density / 160)
*
* @version 1.0.1 2010-12-11
*
* @author
*/
public class DensityUtil {
private static final String TAG = DensityUtil.class.getSimpleName();
// 当前屏幕的 densityDpi
private static float dmDensityDpi = 0.0f;
private static DisplayMetrics dm;
private static float scale = 0.0f;
/**
* 根据构造函数获得当前手机的屏幕系数
*/
public DensityUtil(Context context) {
// 获取当前屏幕
dm = context.getApplicationContext().getResources().getDisplayMetrics();
// 设置 DensityDpi
setDmDensityDpi(dm.densityDpi);
// 密度因子
scale = getDmDensityDpi() / 160;
Logger.i(TAG, toString());
}
/**
* 当前屏幕的 density 因子
*
* @return DmDensity Getter
*/
public static float getDmDensityDpi() {
return dmDensityDpi;
}
/**
* 当前屏幕的 density 因子
*
* @param dmDensityDpi
*/
public static void setDmDensityDpi(float dmDensityDpi) {
DensityUtil.dmDensityDpi = dmDensityDpi;
}
/**
* 密度转换像素
*/
public static int dip2px(float dipValue) {
return (int) (dipValue * scale + 0.5f);
}
/**
* 像素转换密度
*/
public int px2dip(float pxValue) {
return (int) (pxValue / scale + 0.5f);
}
@Override
public String toString() {
return " dmDensityDpi:" + dmDensityDpi;
}
}