手势表面

在 1.9.0 版本加入.

警告

此功能目前处于实验阶段,只要此警告提示存在,其内容可能会发生变化。

完整的应用示例请参阅 kivy/examples/demo/multistroke/main.py

class kivy.uix.gesturesurface.GestureContainer(touch, **kwargs)[源代码]

基类:EventDispatcher

存储手势信息的容器对象。它拥有多个属性,这些属性会随着绘制的进行由`GestureSurface`更新。

参数:
touch

用于初始化手势容器的触摸对象(由on_touch_down接收)。必填。

属性:
active

一旦手势完成(达到 max_stroke 设置或 GestureSurface.temporal_window),则将其设为 False。

active 是一个 BooleanProperty

active_strokes

当前手势中活跃的笔画数,即与此手势关联的并发触摸数。

active_strokes 是一个 NumericProperty

max_strokes

手势中允许的最大笔画数。此值由`GestureSurface.max_strokes`设置,但可在例如`on_gesture_start`中覆盖。

max_strokes 是一个 NumericProperty

was_merged

表示该手势已与另一个手势合并,应视为已丢弃。

was_merged 是一个 BooleanProperty

bbox

包含键 minx、miny、maxx、maxy 的字典,表示手势边界框的大小。

bbox 是一个 DictProperty

width

表示手势的宽度。

width 是一个 NumericProperty

height

表示手势的高度。

height 是一个 NumericProperty

accept_stroke(count=1)[源代码]

如果此容器可以接受 count 个新笔画,则返回 True。

add_stroke(touch, line)[源代码]

将一系列点与touch.uid关联;线条本身由调用者创建,但后续的移动/抬起事件通过我们查找它。这样做是为了避免合并期间出现问题。

complete_stroke()[源代码]

在触摸抬起事件中调用,用于跟踪手势中活跃的笔画数量(我们只希望在手势中的*最后一笔*释放时才分发事件)。

get_vectors(**kwargs)[源代码]

以`kivy.multistroke.Recognizer`可接受的格式返回笔画,作为手势候选或模板。结果会自动缓存;在笔画开始和结束时,以及调用`update_bbox`时,缓存会失效。如果你打算在笔画进行中分析手势,可能需要将`no_cache`参数设置为True。

handles(touch)[源代码]

如果此容器处理给定的触摸,则返回True。

single_points_test()[源代码]

如果手势仅由单点笔画组成,则返回True,在这种情况下我们必须丢弃它,否则将引发异常。

update_bbox(touch)[源代码]

根据触摸坐标更新手势边界框。

class kivy.uix.gesturesurface.GestureSurface(**kwargs)[源代码]

基类:FloatLayout

简单的触摸表面,用于跟踪/绘制触摸移动。通常用于收集适合 kivy.multistroke.Recognizer 的用户输入。

属性:
temporal_window

从最后一次 touch_up 事件到尝试识别手势的等待时间。如果将此值设为 0,则除非满足 max_strokes 条件,否则不会触发 on_gesture_complete 事件。

temporal_window 是一个 NumericProperty,默认值为 2.0。

max_strokes

单次手势中允许的最大笔画数;达到此数值后,将在最终的 touch_up 事件发生时立即开始识别。如果此值设置为 0,则除非 temporal_window 超时,否则不会触发 on_gesture_complete 事件。

max_strokes 是一个 NumericProperty,默认值为 2.0。

bbox_margin

用于检测手势碰撞的边界框边距,单位为像素。

bbox_margin 是一个 NumericProperty,默认值为 30。

draw_timeout

on_gesture_complete 事件触发后,线条/边界框在画布上保留的秒数。如果设置为 0,则手势完成后会立即从表面移除。

draw_timeout 是一个 NumericProperty,默认值为 3.0。

color

用于绘制手势的颜色,采用RGB格式。如果 use_random_color 为 True,则此选项不生效。

color 是一个 ColorProperty,默认值为 [1, 1, 1, 1](白色)。

在 2.0.0 版本发生变更: ListProperty 更改为 ColorProperty

use_random_color

设为True时,将为每个手势随机选择颜色,若如此设置,则`color`属性将被忽略。默认值为False。

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

line_width

用于在表面上追踪触摸的线条宽度。如果只想检测手势而不绘制任何内容,请设置为0。若使用1.0,则通过OpenGL的GL_LINE进行绘制;大于1的值将使用基于三角形的内部绘制方法(效率较低),参见 kivy.graphics

line_width 是一个 NumericProperty,默认值为 2。

draw_bbox

设置为True,如果你想在手势后面绘制边界框。这仅在`line_width` >= 1时有效。默认值为False。

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

bbox_alpha

如果 draw_bbox 为 True,则边界框的不透明度。默认值为 0.1。

bbox_alpha 是一个 NumericProperty,默认值为 0.1。

事件:
on_gesture_start GestureContainer

当在表面上开始一个新手势时触发,即第一次on_touch_down事件不与表面上已有的手势发生碰撞时。

on_gesture_extend GestureContainer

当在手势进行中发生 touch_down 事件时触发。

on_gesture_merge GestureContainer, GestureContainer

当两个手势发生碰撞并合并为一个手势时触发。第一个参数是被合并的手势(不再有效);第二个参数是合并后的(结果)手势。

on_gesture_complete GestureContainer

当一组笔画被视为一个完整手势时触发,这发生在 temporal_window 过期或达到 max_strokes 时。通常你会绑定此事件,并使用提供的 GestureContainerget_vectors() 方法,与你的手势数据库进行匹配。

on_gesture_cleanup GestureContainer

在`on_gesture_complete`触发后`draw_timeout`秒,手势将从画布中移除(如果`line_width > 0`或`draw_bbox`为True),并且在此之前从内部手势列表中移除。

on_gesture_discard GestureContainer

当手势未达到识别所需的最小尺寸要求(宽度/高度小于5,或仅包含单点笔画)时触发。

find_colliding_gesture(touch)[源代码]

检查触摸点的x/y坐标是否与现有手势的边界框发生碰撞。如果是,则返回该手势(否则返回None)。

get_gesture(touch)[源代码]

返回与给定触摸关联的GestureContainer。

init_gesture(touch)[源代码]

从触摸创建一个新手势,即它是表面上的第一个触摸,或者(目前)与任何现有手势的距离都不够近。

merge_gestures(g, other)[源代码]

将两个手势合并在一起,保留较旧的一个,较新的一个会被标记为 GestureContainer.was_merged

on_touch_down(touch)[源代码]

当检测到新的触摸时,我们首先会测试它是否与另一个已知手势的边界框发生碰撞。如果是,则假定该触摸属于该手势的一部分。

on_touch_move(touch)[源代码]

当触摸移动时,我们在画布上的线条中添加一个点,以便路径得到更新。我们还必须检查新点是否与另一个手势的边界框发生碰撞——如果是,则应将它们合并。

on_touch_up(touch)[源代码]

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

更多信息请参阅 on_touch_down()