除了 GestureDetector,Flutter 還提供了 Listener 來監聽觸摸事件。github
它也是一個 Widget,使用它包裹一個 Widget,就能可以處理該 Widget 上發生的觸摸事件。bash
看看經過 Listener 能夠處理哪些事件:post
屬性 | 類型 | 說明 |
---|---|---|
onPointerDown | (PointerDownEvent event){} | 按下時觸發 |
onPointerMove | (PointerDownEvent event){} | 移動時觸發 |
onPointerEnter | (PointerDownEvent event){} | 進入Widget區域時觸發 |
onPointerExit | (PointerDownEvent event){} | 離開Widget區域時觸發 |
onPointerUp | (PointerDownEvent event){} | 離開屏幕時觸發 |
onPointerDown | (PointerDownEvent event){} | 按下時觸發 |
onPointerCancel | (PointerDownEvent event){} | 取消觸摸時觸發 |
behavior | HitTestBehavior | 控制事件傳遞。這個下面再說明 |
先看看例子🌰:spa
Listener(
onPointerUp: (e){
Navigator.pop(context);
},
child: Container(
height: 80,
color: Colors.blue,
alignment: Alignment.center,
child: Text(
text,
style: TextStyle(
color: Colors.white, decoration: TextDecoration.none),
),
),
)
複製代碼
仍是那套用法,使用它去包裹要處理事件的 Widget 節點,就至關於使節點得到處理事件的能力。3d
HitTestBehavior 用於控制事件的傳遞方式。指針
HitTestBehavior.deferToChildcode
只有有子 Widget 經過了 Hit-Test,才接收一系列的事件,接收區域也會被限制在該子 Widget 區域中。cdn
HitTestBehavior.opaqueblog
Widget 可以經過 Hit-Test,接收事件,且能阻止在它以前的 Widget(直觀來看就是被它擋住的 Widget)接收事件。
簡單來講就是事件 不能透傳。
HitTestBehavior.translucent
Widget 可以經過 Hit-Test,接收事件,且不會阻止它以前的 Widget(直觀來看就是被它擋住的 Widget)接收事件。
簡單來講就是事件 能透傳。
PointerEvent 是 Listener 回調中的參數,儲存了一系列的觸摸信息。
看看一些比較經常使用的屬性:
屬性 | 類型 | 說明 |
---|---|---|
pointer | int | 標示一次觸摸id。從新觸摸會分配新的值 |
kind | PointerDeviceKind | 觸摸事件的輸入類型。是觸摸,仍是鼠標.. |
position | Offset | 當前座標。相對於全局座標 |
delta | Offset | 指針移動期間,與上一次事件的移動距離 |
pressure | double | 按壓力度。取值範圍 0.0-1.0 |
若是不想讓一個 Widget 接收觸摸事件,那就用 IgnorePointer 包裹它好了。
IgnorePointer(
ignoring: true,
child: MyWidget(),
)
複製代碼
使用比較簡單,ignoring 控制是否忽略,默認爲 true。