热门标签 | 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;
    }
}

推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
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社区 版权所有