平移/缩放控件

_images/scatter.gif

Scatter 用于构建可交互的控件,这些控件可以在多点触控系统中通过两根或更多手指进行平移、旋转和缩放。

Scatter 拥有自身的矩阵变换:在绘制子部件之前会修改模型视图矩阵,并在绘制完成后恢复之前的矩阵。这使得可以对整个子部件树执行旋转、缩放和平移操作,而无需更改任何部件属性。这一特定行为使 Scatter 独具特色,但也有一些优点/限制需要考虑:

  1. 子组件相对于散点图(Scatter)进行定位,类似于 RelativeLayout。因此,在拖动散点图时,子组件的位置不会改变,只有散点图本身的位置会发生变化。

  2. 散点图的大小不影响其子元素的大小。

  3. 如果你想要调整散点图(Scatter)的大小,请使用缩放(scale),而不是尺寸(size)(参见第2点)。缩放会同时变换散点图及其子元素,但不会改变其尺寸。

  4. Scatter 不是一种布局。您必须自行管理子组件的大小。

对于触摸事件,scatter会在on_touch_down/move/up事件中自动从父矩阵转换为scatter矩阵。如果你手动处理这些操作,则需要使用:meth:`~kivy.uix.widget.Widget.to_parent`和:meth:`~kivy.uix.widget.Widget.to_local`方法。

用法

默认情况下,Scatter没有图形表示:它只是一个容器。其理念是将Scatter与其他部件结合使用,例如一个:class:~kivy.uix.image.Image

scatter = Scatter()
image = Image(source='sun.jpg')
scatter.add_widget(image)

控件交互

默认情况下,所有交互都是启用的。您可以通过使用do_rotation、do_translation和do_scale属性来有选择地禁用它们。

禁用旋转:

scatter = Scatter(do_rotation=False)

好的,请发送需要翻译的英文内容。

scatter = Scatter(do_rotation=False, do_scale=False)

仅允许在x轴上进行平移:

scatter = Scatter(do_rotation=False, do_scale=False,
                  do_translation_y=False)

自动置顶

如果 Scatter.auto_bring_to_front 属性为 True,则当散点部件被触摸时,它会被从父部件中移除并重新添加(置于最前,位于父部件中所有其他部件之上)。当您操作多个散点部件且不希望活动部件被部分隐藏时,此功能非常有用。

缩放限制

我们使用的是双精度表示的32位矩阵。这意味着我们的缩放存在限制。在我们的实现中,无法进行无限缩小或放大。通常,你不会触及最小缩放比例(因为它在屏幕上不可见),但最大缩放比例为9.99506983235e+19(2^66)。

你也可以限制允许的最小和最大缩放比例:

scatter = Scatter(scale_min=.5, scale_max=3.)

行为

在 1.1.0 版本发生变更: 如果未启用任何控件交互,则触摸处理器将永远不会返回 True。

class kivy.uix.scatter.Scatter(**kwargs)[源代码]

基类:Widget

Scatter 类。更多信息请参阅模块文档。

事件:
on_transform_with_touch

当散点图(Scatter)被用户触摸或多点触控(如平移或缩放)变换时触发。

on_bring_to_front

当散件被置于最前面时触发。

在 1.9.0 版本发生变更: 添加了 on_bring_to_front 事件。

在 1.8.0 版本发生变更: 新增了 on_transform_with_touch 事件。

apply_transform(trans, post_multiply=False, anchor=(0, 0))[源代码]

通过应用“trans”变换矩阵(在其当前变换状态之上)来变换散点。结果矩阵可以在 transform 属性中找到。

参数:
trans: Matrix

应用于散点图部件的变换矩阵。

anchor:元组,默认值为 (0, 0)。

用作变换原点的点(使用局部控件空间)。

post_multiply:布尔值,默认为 False。

如果为 True,则变换矩阵是后乘的(如同在当前变换之前应用)。

使用示例:

from kivy.graphics.transformation import Matrix
mat = Matrix().scale(3, 3, 3)
scatter_instance.apply_transform(mat)
auto_bring_to_front

如果为 True,该控件将自动被推送到父控件列表的顶部以进行绘制。

auto_bring_to_front 是一个 BooleanProperty,默认值为 True。

bbox

widget 在父空间中的边界框:

((x, y), (w, h))
# x, y = lower left corner

bbox 是一个 AliasProperty

center

控件的中心位置。

center 是 (center_x, center_y) 属性的 ReferenceListProperty

center_x

控件的X中心位置。

center_x 是 (x + width / 2.) 的 AliasProperty

center_y

控件的Y轴中心位置。

center_y 是 (y + height / 2.) 的 AliasProperty

collide_point(x, y)[源代码]

检查点 (x, y) 是否位于控件的轴对齐边界框内。

参数:
x:数值

点的x位置(在父坐标中)

y:数值

点的y坐标(相对于父坐标)

返回:

一个布尔值。如果该点在边界框内,则为True,否则为False。

>>> Widget(pos=(10, 10), size=(50, 50)).collide_point(40, 40)
True
do_collide_after_children

如果为 True,则在将触摸事件分发给子组件之后,才会进行限制触摸在散件(Scatter)内部的碰撞检测。这样,您可以将子组件放置在散件的边界框之外,并且仍然能够触摸到它们。

do_collide_after_children 是一个 BooleanProperty,默认值为 False。

在 1.3.0 版本加入.

do_rotation

允许旋转。

do_rotation 是一个 BooleanProperty,默认值为 True。

do_scale

允许缩放。

do_scale 是一个 BooleanProperty,默认值为 True。

do_translation

允许在X轴或Y轴上进行平移。

do_translation 是 (do_translation_x + do_translation_y) 的 AliasProperty

do_translation_x

允许在X轴上进行平移。

do_translation_x 是一个 BooleanProperty,默认值为 True。

do_translation_y

允许在Y轴上进行平移。

do_translation_y 是一个 BooleanProperty,默认值为 True。

on_bring_to_front(touch)[源代码]

当触摸事件导致散件被带到父级前面时调用(仅当 auto_bring_to_front 为 True 时)。

参数:
touch

将散点图带到前台的触摸对象。

在 1.9.0 版本加入.

on_motion(etype, me)[源代码]

当接收到一个运动事件时调用。

参数:
etypestr

事件类型,取值为"begin"、"update"或"end"之一。

meMotionEvent

收到运动事件

返回:

bool 类型,设为 True 可停止事件分发。

在 2.1.0 版本加入.

警告

这是一个实验性方法,只要此警告存在,它就仍处于实验阶段。

on_touch_down(touch)[源代码]

接收触摸按下事件。

参数:
touchMotionEvent

收到触摸事件。该触摸位于父级坐标系中。关于坐标系统的讨论,请参阅 relativelayout

返回:

bool 如果为 True,触摸事件的派发将停止。如果为 False,事件将继续派发给控件树中的其余部分。

on_touch_move(touch)[源代码]

接收触摸移动事件。触摸坐标位于父级坐标系中。

更多信息请参阅 on_touch_down()

on_touch_up(touch)[源代码]

接收触摸抬起事件。触摸坐标位于父级坐标系中。

更多信息请参阅 on_touch_down()

on_transform_with_touch(touch)[源代码]

当触摸事件已变换散件(scatter widget)时调用。默认情况下此操作不执行任何动作,但可被派生类重写,以响应用户输入引起的变换。

参数:
touch

触发变换的触摸对象。

在 1.8.0 版本加入.

pos

控件的位置。

pos 是 (x, y) 属性的 ReferenceListProperty

right

控件的右侧位置。

right 是 (x + width) 的 AliasProperty

rotation

散点图逆时针方向旋转的度数。

rotation 是一个 AliasProperty,默认值为 0.0。

scale

散点的缩放值。

scale 是一个 AliasProperty,默认值为 1.0。

scale_max

允许的最大缩放因子。

scale_max 是一个 NumericProperty,默认值为 1e20。

scale_min

允许的最小缩放因子。

scale_min 是一个 NumericProperty,默认值为 0.01。

to_local(x, y, **k)[源代码]

将父级坐标转换为本地(当前控件)坐标。

关于坐标系统的详细信息,请参阅 relativelayout

参数:
relative:布尔值,默认为 False

如果你想要将坐标转换为相对于控件的坐标,请将其设置为True。

to_parent(x, y, **k)[源代码]

将局部(当前控件)坐标转换为父控件坐标。

关于坐标系统的详细信息,请参阅 relativelayout

参数:
relative:布尔值,默认为 False

如果你想要将控件的相对位置转换为其父坐标,请将其设置为True。

top

控件的顶部位置。

top 是 (y + height) 的 AliasProperty

transform

变换矩阵。

transform 是一个 ObjectProperty,默认值为单位矩阵。

备注

该矩阵反映了当前变换矩阵的状态,但直接设置它将清除先前应用的变换。如需在考虑上下文的情况下应用变换,请使用 apply_transform 方法。

transform_inv

变换矩阵的逆矩阵。

transform_inv 是一个 ObjectProperty,默认值为单位矩阵。

translation_touches

确定翻译是由单次触摸还是多次触摸触发的。此属性仅在 do_translation 为 True 时生效。

translation_touches 是一个 NumericProperty,默认值为 1。

在 1.7.0 版本加入.

x

控件的X坐标位置。

x 是一个 NumericProperty,默认值为 0。

y

控件的Y坐标位置。

y 是一个 NumericProperty,默认值为 0。

class kivy.uix.scatter.ScatterPlane(**kwargs)[源代码]

基类:Scatter

这本质上是一个无界的Scatter控件。它是一个便捷类,旨在简化对无限平面的处理。

collide_point(x, y)[源代码]

检查点 (x, y) 是否位于控件的轴对齐边界框内。

参数:
x:数值

点的x位置(在父坐标中)

y:数值

点的y坐标(相对于父坐标)

返回:

一个布尔值。如果该点在边界框内,则为True,否则为False。

>>> Widget(pos=(10, 10), size=(50, 50)).collide_point(40, 40)
True