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() 引數,如果沒有指定引數,則匯入指定資料中的所有手勢。

廣告
© . All rights reserved.