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

推荐阅读
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
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社区 版权所有