Kivy 简明教程

Kivy - Multistroke

Kivy 中的多笔势是多个 Gesture 对象的集合。手势构成了由“touch_down”和“touch_up”事件之间的触控点列表构建的单个笔画。多笔势是此类笔画的集合。

“kivy.multistroke”模块实现了量角器手势识别算法。此模块中定义的两个重要类为 MultistrokeGestureRecognizer

MultiStrokeGesture 类维持一组笔画并生成手势识别器,这些手势识别器用于稍后针对此手势评估候选项。

使用以下语法来获取 MultiStroke 对象-

from kivy.vector import Vector
from kivy.multistroke import MultistrokeGesture

gesture = MultistrokeGesture('my_gesture', strokes=[
   [Vector(x1, y1), Vector(x2, y2), ...... ], # stroke 1
   [Vector(), Vector(), Vector(), Vector() ] # stroke 2
   #, [stroke 3], [stroke 4], ...
])

即使所有笔触都组合到一个列表(单笔触)中,您仍然应该分别指定笔触,并将 stroke_sensitive 属性设置为 True。

识别器存储 MultistrokeGesture 对象的列表。它是一个与 GestureDatabase 类似的搜索/数据库 API。它维护并允许您在其中搜索用户输入的手势。

识别器数据库是 UnistrokeTemplate 对象的一个容器,并实现堆排列算法来自动生成所有可能的笔划顺序。

候选项类的对象表示用户输入的一组单笔触路径。此对象通过调用 Recognizer.recognize() 自动实例化。

from kivy.vector import Vector
from kivy.multistroke import Recognizer

gdb = Recognizer()
gdb.recognize([
   [Vector(x1, y1), Vector(x2, y2)],
   [Vector(x3, y3), Vector(x4, y4)]])

识别器对象能够生成这些事件-

  1. on_search_start - 当使用此识别器启动新的搜索时激发。

  2. on_search_complete - 当正在运行的搜索结束时激发,无论出于何种原因。

这些事件可以映射到回调函数来跟踪识别器.recognize() 方法完成的搜索操作的进度。

gdb.bind(on_search_start=search_start)
gdb.bind(on_search_complete=search_stop)

回调方法的示例如下 -

def search_start(gdb, pt):
   print("A search is starting with {} tasks".format(pt.tasks))

def search_stop(gdb, pt):
   best = pt.best
   print("Search ended {}. Best is {} (score {}, distance {})".format(
      pt.status, best['name'], best['score'], best['dist'] ))

最后,“kivy.multistroke”模块还提供一个 ProgressTracker 类。它表示正在进行(或已完成)的搜索操作。

当调用识别器.识别器() 方法时,会自动实例化跟踪器对象并由该方法返回。results 属性是一个在识别操作进行时会更新的字典。

progress = gdb.recognize([
   [Vector(x1, y1), Vector(x2, y2)],
   [Vector(x3, y3), Vector(x4, y4)]])

progress.bind(on_progress=my_other_callback)
print(progress.progress)      # = 0
print(result.progress)        # = 1

您可以使用 export_gesture() 函数将多笔触手势保存到文件中。

  1. export_gesture(filename=None) - 它将一个 MultistrokeGesture 对象列表导出到一个 base64 编码的字符串中,该字符串可以使用 parse_gesture() 函数解码为一个 Python 列表。它还可以使用 Recognizer.import_gesture() 直接导入到数据库中。如果指定了 filename,输出将写入磁盘。

  2. import_gesture(data=None,filename=None) - import_gesture() 函数将手势引入到识别器数据库中。使用此函数导入由 export_gesture() 格式化的一个手势列表。必须指定 data 或 filename 参数。如果未指定此方法,则会接受可选的识别器.筛选() 参数,则会导入指定数据中的所有手势。