我可以为布局尺寸使用可缩放像素吗?

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

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

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

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

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

这背后的原因是什么?两个dpS和sps的转换为某设备特定的像素量,最终,不是吗?那么核心区别是什么?

回答

从文档: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;


以上是我可以为布局尺寸使用可缩放像素吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>