5

有人知道使用sp单位作为布局尺寸有什么问题吗?那么,假设我有一个文本,例如将高度16sp设置为是否有任何问题,所以它会随文本缩放?TextView20sp

<TextView
    android:textSize="16sp"
    android:layout_width="match_parent"
    android:layout_height="20sp"
    ...

这样,文本周围的填充在缩放后与文本大小保持成比例。此外,这对于wrap_content不推荐使用的自动调整大小很有用。

但是,官方文档声明sp永远不应该用于文本大小(尽管没有任何解释):

但是,在定义文本大小时,您应该改用可缩放像素 (sp) 作为单位(但不要使用 sp 作为布局大小)。

这背后的原因是什么?dps 和s 最终都sp转换为特定设备的像素量,不是吗?那么核心区别是什么?

4

2 回答 2

5

从文档:https ://developer.android.com/training/multiscreen/screendensities

要在不同密度的屏幕上保持 UI 的可见尺寸,您必须使用与密度无关的像素 (dp) 作为度量单位来设计 UI。一 dp 是一个虚拟像素单位,大致等于中等密度屏幕(160dpi;“基线”密度)上的一个像素。

因此,dp 的整个想法是指定一个独立于屏幕密度的度量。

但是,在定义文本大小时,您应该改用可缩放像素 (sp) 作为单位(但不要使用 sp 作为布局大小)。默认情况下,sp 单位的大小与 dp 相同,但它会根据用户的首选文本大小调整大小。

这里的想法是,如果用户有视力障碍,他可以通过改变系统设置来改变文本的大小。另请注意sp 单位的大小与 dp 相同:系统设置为文本的默认大小,dp 和 sp 之间没有区别。所以你不应该看到改变 sp 和 dp 之间的布局大小有任何区别。两者都将转换为相同数量的像素。

但从不使用 sp 作为布局大小的原因仅仅是您不希望图像、按钮或任何其他布局维度根据文本大小的系统偏好进行缩放。这对我来说似乎很明显。

辅助功能设置: https: //support.google.com/accessibility/android/answer/6006972

Android OS 上将不同单位转换为像素的代码是:(来自https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/util/TypedValue。爪哇)

    public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }

以及解释什么是 scaledDensity 的评论:(来自https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/util/DisplayMetrics.java

    /**
     * A scaling factor for fonts displayed on the display.  This is the same
     * as {@link #density}, except that it may be adjusted in smaller
     * increments at runtime based on a user preference for the font size.
     */
    public float scaledDensity;
于 2021-03-01T01:32:58.430 回答
-1

在我看来,如果我错了,我认为你可以同时使用任何人来纠正我,因为我还在学习。现在回到答案

不同的是dp是固定单位,sp会根据手机字体大小设置进行缩放。

这是示例

带有SPDP的文本

在此处输入图像描述

更改设备文本设置(Settings -> Display -> Font Size)

在此处输入图像描述

现在重新打开应用程序并重新查看文本,您会看到使用SP的文本的高度与DP不同。

在此处输入图像描述

于 2021-03-05T12:21:35.390 回答