Kivy - 多笔画手势



在 Kivy 中,多笔画手势是由多个手势对象组成的集合。一个手势包含单个笔画,该笔画由“touch_down”和“touch_up”事件之间的触摸点列表构成。多笔画手势是此类笔画的集合。

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

MultiStrokeGesture 类维护一组笔画,并生成单笔画(即 UnistrokeTemplate)排列,这些排列稍后用于评估针对此手势的候选对象。

可以使用以下语法获得 MultriStroke 对象:

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。

Recognizer 存储 MultistrokeGesture 对象列表。它类似于 GestureDatabase 的搜索/数据库 API。它维护一个列表,并允许您在其间搜索用户输入的手势。

Recognizer 数据库是 UnistrokeTemplate 对象的容器,并实现堆排列算法以自动生成所有可能的笔画顺序。

Candidate 类的对象表示用户输入的一组单笔画路径。调用 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)]])

Recognizer 对象能够生成以下事件:

  • on_search_start - 使用此 Recognizer 启动新搜索时触发。

  • on_search_complete - 运行中的搜索结束时触发,无论出于何种原因。

这些事件可以映射到回调函数,以跟踪 Recognizer.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 类。它表示正在进行(或已完成)的搜索操作。

调用 Recognizer.recognize() 方法时,会自动实例化跟踪器对象并将其返回。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() 函数将多笔画手势保存到文件中。

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

  • import_gesture(data=None,filename=None) - import_gesture() 函数将手势引入 Recognizer 数据库。使用此函数导入 export_gesture() 格式化的列表手势。必须指定 data 或 filename 参数。此方法接受可选的 Recognizer.filter() 参数,如果没有指定参数,则导入指定数据中的所有手势。

广告