热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中dip、px、pt和sp的详细解析

本文详细介绍了Android开发中常用的单位dip(设备独立像素)、px(像素)、pt(点)和sp(可缩放像素),并解释了它们在不同屏幕密度下的应用。

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

推荐阅读
  • 本文介绍如何通过自定义控件LoadLayout实现ListView的上拉加载更多和下拉刷新功能。LoadLayout支持上拉加载,而下拉刷新则利用了android.support.v4.widget.SwipeRefreshLayout组件。 ... [详细]
  • 本文介绍了如何使用JFreeChart库创建一个美观且功能丰富的环形图。通过设置主题、字体和颜色等属性,可以生成符合特定需求的图表。 ... [详细]
  • 在许多地理位置选择类的应用程序中,侧边栏是常见的用户界面元素,用于通过选择特定的字母快速定位和选择地点。本文将详细介绍如何在Android应用中创建一个具有波浪效果的自定义侧边栏,以提升用户体验。 ... [详细]
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • Android开发技巧:实现带描边的圆角图片
    本文介绍了一种在Android应用中实现带描边的圆角图片的方法。通过使用BitmapShader类,开发者可以轻松地为图片添加圆角和描边效果,提升应用的视觉体验。 ... [详细]
  • 如何在应用中添加Banner广告
    本文详细介绍如何在移动应用中集成并添加Banner广告,包括必要的准备工作、代码实现及常见问题解决方法,帮助开发者快速掌握添加Banner广告的技术要点。 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 理解与应用:独热编码(One-Hot Encoding)
    本文详细介绍了独热编码(One-Hot Encoding)与哑变量编码(Dummy Encoding)两种方法,用于将分类变量转换为数值形式,以便于机器学习算法处理。文章不仅解释了这两种编码方式的基本原理,还探讨了它们在实际应用中的差异及选择依据。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 管理类联考英语复习指南:基础语法(八)
    本文探讨了谓语动词和分词在句子中的作用,包括分词作为状语、定语和宾语补足语的使用方法,以及分词的时态和语态变化。 ... [详细]
  • 本文介绍了ADB(Android Debug Bridge)的基本概念、安装方法、环境配置、连接真机步骤以及常用命令和高级技巧。ADB是一个强大的工具,适用于Android设备的开发和调试。 ... [详细]
  • 本文将详细介绍如何使用ViewPager实现多页面滑动切换,并探讨如何去掉其默认的左右切换动画效果。ViewPager是Android开发中常用的组件之一,用于实现屏幕间的内容切换。 ... [详细]
author-avatar
炙天痕_953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有