手勢操作在 Flutter 中分為兩類:
第一類是原始的指針事件(Pointer Event),即原生開發(fā)中常見的觸摸事件,表示屏幕上觸摸(或鼠標、手寫筆)行為觸發(fā)的位移行為;
第二類則是手勢識別(Gesture Detector),表示多個原始指針事件的組合操作,如點擊、雙擊、長按等,是指針事件的語義化封裝。
指針事件表示用戶交互的原始觸摸數據,如手指接觸屏幕 PointerDownEvent、手指在屏幕上移動 PointerMoveEvent、手指抬起 PointerUpEvent,以及觸摸取消 PointerCancelEvent。在手指接觸屏幕,觸摸事件發(fā)起時,F(xiàn)lutter 會確定手指與屏幕發(fā)生接觸的位置上究竟有哪些組件,并將觸摸事件交給最內層的組件去響應。事件會從這個最內層的組件開始,沿著組件樹向根節(jié)點向上冒泡分發(fā)。通過 hitTestBehavior 去調整組件在命中測試期內應該如何表現(xiàn),比如把觸摸事件交給子組件,或者交給其視圖層級之下的組件去響應。關于組件層面的原始指針事件的監(jiān)聽,F(xiàn)lutter 提供了 Listener Widget,可以監(jiān)聽其子 Widget 的原始指針事件。
Listener(
? child: Container(
? ? color: Colors.black,
? ? width: 300,
? ? height: 300,
? ),
? onPointerDown: (event) => print("down $event"),// 手勢按下回調
? onPointerMove:? (event) => print("move $event"),// 手勢移動回調
? onPointerUp:? (event) => print("up $event"),// 手勢抬起回調
);
Gesture 是手勢語義的抽象,而如果我們想從組件層監(jiān)聽手勢,則需要使用 GestureDetector。GestureDetector 是一個處理各種高級用戶觸摸行為的 Widget,與 Listener 一樣,也是一個功能性組件。
GestureDetector(// 手勢識別
? ? ? ? child: Container(color: Colors.red,width: 50,height: 50),// 紅色子視圖
? ? ? ? onTap: ()=>print("Tap"),// 點擊回調
? ? ? ? onDoubleTap: ()=>print("Double Tap"),// 雙擊回調
? ? ? ? onLongPress: ()=>print("Long Press"),// 長按回調
? ? ? ? onPanUpdate: (e) {// 拖動回調
? ? ? ? ? setState(() {
? ? ? ? ? ? // 更新位置
? ? ? ? ? ? _left += e.delta.dx;
? ? ? ? ? ? _top += e.delta.dy;
? ? ? ? ? });
? ? ? ? },
? ? ? ),