指标

在 1.5.0 版本加入.

屏幕由其物理尺寸、密度和分辨率定义。这些因素对于在任何地方创建尺寸正确的UI至关重要。

在Kivy中,所有图形管线均以像素为单位工作。然而,使用像素作为测量单位存在问题,因为尺寸会随屏幕变化而改变。

尺寸

如果你希望为不同屏幕尺寸设计用户界面,就需要使用更好的测量单位。Kivy 提供了一些更具可扩展性的替代方案。

单位:
pt

点(pt)——基于屏幕物理尺寸的1/72英寸。建议优先使用sp而非pt。

mm

毫米 - 基于屏幕的物理尺寸。

cm

厘米 - 基于屏幕的物理尺寸。

in

英寸 - 基于屏幕的物理尺寸。

dp

密度无关像素 - 一种基于屏幕物理密度的抽象单位。当 density 为 1 时,1dp 等于 1px。在更高密度的屏幕上运行时,用于绘制 1dp 的像素数量会按屏幕 dpi 的相应比例放大,而在较低 dpi 的屏幕上则相反。dp 与像素的比率会随屏幕密度变化,但不一定成正比。使用 dp 单位是一种简单的解决方案,可使布局中的视图尺寸在不同屏幕密度下正确调整。换句话说,它为你的 UI 在不同设备上的实际尺寸提供了一致性。

sp

与缩放无关的像素 - 这类似于dp单位,但还会根据用户的字体大小偏好进行缩放。我们建议您在指定字体大小时使用此单位,这样字体大小将同时适应屏幕密度和用户的偏好。

示例

以下是一个创建标签的示例,其中设置了sp字体大小,并手动设置了高度,带有10dp的边距::

#:kivy 1.5.0
<MyWidget>:
    Label:
        text: 'Hello world'
        font_size: '15sp'
        size_hint_y: None
        height: self.texture_size[1] + dp(10)

手动控制度量标准

指标无法在运行时更改。一旦值被转换为像素,就无法再获取原始值。这是因为设备的DPI和密度无法在运行时更改。

我们提供了一些环境变量来控制指标:

  • KIVY_METRICS_DENSITY:如果设置了此值,将使用该值代替系统的 density。在安卓系统上,该值在 0.75、1、1.5 和 2 之间变化。

  • KIVY_METRICS_FONTSCALE:如果设置了该值,将使用此值作为 fontscale,而不是系统值。在安卓系统上,该值在0.8到1.2之间变化。

  • KIVY_DPI:如果设置了此值,它将被用于 dpi。请注意,设置 DPI 不会影响 dp/sp 表示法,因为这些是基于屏幕密度的。

例如,如果你想模拟高密度屏幕(如HTC One X):

KIVY_DPI=320 KIVY_METRICS_DENSITY=2 python main.py --size 1280x720

或者中等密度(如摩托罗拉Droid 2):

KIVY_DPI=240 KIVY_METRICS_DENSITY=1.5 python main.py --size 854x480

你也可以通过以下方式模拟用户对字体缩放比例的替代偏好设置:

KIVY_METRICS_FONTSCALE=1.2 python main.py
kivy.metrics.Metrics: MetricsBase = <kivy.metrics.MetricsBase object>

存储窗口缩放因子的metrics对象。

在 1.7.0 版本加入.

在 2.1.0 版本发生变更: Metrics 现在是一个上下文注册变量(类似于例如 Clock)。

class kivy.metrics.MetricsBase(**kwargs)[源代码]

基类:EventDispatcher

包含 Metrics 默认属性的类。请勿直接使用此类,而应使用 Metrics 实例。

cm: float

将厘米转换为像素的缩放因子。

cm 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.cm 当屏幕配置变化导致 cm 改变时,宽度会相应更新。

density: float

屏幕的密度。

该值在桌面平台上默认为1,但在Android上会根据屏幕不同而变化。

density 是一个 AliasProperty,可以设置以更改其值。但是,如果我们从 Window 获取 density,并且 Window 的 density 发生变化,那么 density 会被重新加载并重置。

dp: float

将密度无关像素转换为像素的缩放因子。

dp 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.dp 当屏幕配置变化导致 dp 改变时,宽度会相应更新。

dpi: float

屏幕的DPI。

根据平台的不同,DPI可以从窗口提供者(主要是桌面端)或特定于平台的模块(如android/ios)中获取。

dpi 是一个 AliasProperty,可以设置以改变其值。但是,如果我们从 Window 获取 density,并且 Window 的 dpi 发生变化,那么 density 会被重新加载并重置。

dpi_rounded: int

返回屏幕的 dpi,四舍五入到最接近的120、160、240或320。

dpi_rounded 是一个 AliasProperty,当 dpi 发生变化时会更新。

fontscale: float

字体缩放用户偏好。

该值默认为1,但可在0.8至1.2之间变化。

fontscale 是一个 AliasProperty,可以设置它来改变该值。

inch: float

将英寸转换为像素的缩放因子。

inch 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.inch 当屏幕配置变化导致 inch 改变时,宽度将自动更新。

mm: float

将毫米转换为像素的缩放因子。

mm 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.mm 当屏幕配置变化导致 mm 改变时,宽度会随之更新。

pt: float

将点转换为像素的缩放因子。

pt 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.pt 当屏幕配置变化导致 pt 改变时,宽度会相应更新。

reset_dpi(*args)[源代码]

将 dpi(以及可能的 density)重置为平台默认值,覆盖任何手动设置的值。

reset_metrics()[源代码]

将 dpi/密度/字体缩放重置为平台默认值,覆盖任何手动设置的值。

sp: float

将比例无关像素转换为像素的缩放因子。

sp 是一个 AliasProperty,包含该因子。例如在 KV 中:width: self.texture_size[0] + 10 * Metrics.sp 会在屏幕配置变化导致 sp 改变时更新宽度。

kivy.metrics.cm(value) float[源代码]

从厘米转换为像素

kivy.metrics.dp(value) float[源代码]

将密度无关像素转换为像素

kivy.metrics.dpi2px(value, unicode ext) float

根据扩展名转换值。

kivy.metrics.inch(value) float[源代码]

将英寸转换为像素

kivy.metrics.mm(value) float[源代码]

从毫米转换为像素

kivy.metrics.pt(value) float[源代码]

将点转换为像素

kivy.metrics.sp(value) float[源代码]

将独立于比例的像素转换为像素