做(zuò)自(zì)由與創造的先行(xíng)者

Flutter 手勢

Flutter開(kāi)發手冊

介紹

本文檔介紹了(le)如(rú)何在Flutter中監聽并響應手勢(點擊、拖動和(hé)縮放)。

Flutter中的手勢系統有兩個獨立的層。第一(yī)層有原始指針(pointer)事件,它描述了(le)屏幕上(shàng)指針(例如(rú),觸摸,鼠标和(hé)觸控筆(bǐ))的位置和(hé)移動。 第二層有手勢,描述由一(yī)個或多個指針移動組成的語義動作(zuò)。

Pointers

指針(Pointer)代表用戶與設備屏幕交互的原始數(shù)據。有四種類型的指針事

PointerDownEvent 指針接觸到屏幕的特定位置

PointerMoveEvent 指針從(cóng)屏幕上(shàng)的一(yī)個位置移動到另一(yī)個位置

PointerUpEvent 指針停止接觸屏幕

PointerCancelEvent 指針的輸入事件不再針對此應用(事件取消)

在指針按下(xià)時(shí),框架對您的應用程序執行(xíng)_命中測試_,以确定指針與屏幕相接的位置存在哪些widget。 指針按下(xià)事件(以及該指針的後續事件)然後被分發到由_命中測試_發現的最內(nèi)部的widget。 從(cóng)那(nà)裏開(kāi)始,這(zhè)些事件會冒泡在widget樹(shù)中向上(shàng)冒泡,這(zhè)些事件會從(cóng)最內(nèi)部的widget被分發到到widget根的路徑上(shàng)的所有小部件(譯者語:這(zhè)和(hé)web中事件冒泡機制相似), 沒有機制取消或停止冒泡過程(譯者語:這(zhè)和(hé)web不同,web中的時(shí)間(jiān)冒泡是可(kě)以停止的)。

To listen to pointer events directly from the widgets layer, use a Listener widget. However, generally, consider using gestures (as discussed below) instead. 要(yào)直接從(cóng)widget層監聽指針事件,可(kě)以使用Listenerwidget。 但(dàn)是,通(tōng)常,請(qǐng)考慮使用手勢(如(rú)下(xià)所述)

手勢

手勢表示可(kě)以從(cóng)多個單獨的指針事件(甚至可(kě)能(néng)是多個單獨的指針)識别的語義動作(zuò)(例如(rú),輕敲,拖動和(hé)縮放)。 完整的一(yī)個手勢可(kě)以分派多個事件,對應于手勢的生命周期(例如(rú),拖動開(kāi)始,拖動更新和(hé)拖動結束):

TaponTapDown 指針已經在特定位置與屏幕接觸onTapUp 指針停止在特定位置與屏幕接觸onTap tap事件觸發onTapCancel 先前指針觸發的onTapDown不會在觸發tap事件

雙擊onDoubleTap 用戶快(kuài)速連續兩次在同一(yī)位置輕敲屏幕.

長(cháng)按onLongPress 指針在相同位置長(cháng)時(shí)間(jiān)保持與屏幕接觸

垂直拖動onVerticalDragStart 指針已經與屏幕接觸并可(kě)能(néng)開(kāi)始垂直移動onVerticalDragUpdate 指針與屏幕接觸并已沿垂直方向移動.onVerticalDragEnd 先前與屏幕接觸并垂直移動的指針不再與屏幕接觸,并且在停止接觸屏幕時(shí)以特定速度移動

水平拖動onHorizontalDragStart 指針已經接觸到屏幕并可(kě)能(néng)開(kāi)始水平移動onHorizontalDragUpdate 指針與屏幕接觸并已沿水平方向移動onHorizontalDragEnd 先前與屏幕接觸并水平移動的指針不再與屏幕接觸,并在停止接觸屏幕時(shí)以特定速度移動

要(yào)從(cóng)widget層監聽手勢,請(qǐng)使用 GestureDetector.

如(rú)果您使用的是Material Components,那(nà)麽大多數(shù)widget已經對tap或手勢做(zuò)出了(le)響應。 例如(rú) IconButton和(hé) FlatButton 響應presses(taps),ListView響應滑動事件觸發滾動。 如(rú)果您不使用這(zhè)些widget,但(dàn)想要(yào)在點擊時(shí)上(shàng)出現“墨水飛濺”效果,可(kě)以使用InkWell。

手勢消歧

在屏幕上(shàng)的指定位置,可(kě)能(néng)會有多個手勢檢測器。所有這(zhè)些手勢檢測器在指針事件流經過并嘗試識别特定手勢時(shí)監聽指針事件流。 GestureDetector widget決定是哪種手勢。

當屏幕上(shàng)給定指針有多個手勢識别器時(shí),框架通(tōng)過讓每個識别器加入一(yī)個“手勢競争場”來确定用戶想要(yào)的手勢。“手勢競争場”使用以下(xià)規則确定哪個手勢勝出

在任何時(shí)候,識别者都(dōu)可(kě)以宣布失敗并離開(kāi)“手勢競争場”。如(rú)果在“競争場”中隻剩下(xià)一(yī)個識别器,那(nà)麽該識别器就是赢家

在任何時(shí)候,識别者都(dōu)可(kě)以宣布勝利,這(zhè)會導緻勝利,并且所有剩下(xià)的識别器都(dōu)會失敗

例如(rú),在消除水平和(hé)垂直拖動的歧義時(shí),兩個識别器在接收到指針向下(xià)事件時(shí)進入“手勢競争場”。識别器觀察指針移動事件。 如(rú)果用戶将指針水平移動超過一(yī)定數(shù)量的邏輯像素,則水平識别器将聲明(míng)勝利,并且手勢将被解釋為(wèi)水平拖拽。 類似地(dì),如(rú)果用戶垂直移動超過一(yī)定數(shù)量的邏輯像素,垂直識别器将宣布勝利。

當隻有水平(或垂直)拖動識别器時(shí),“手勢競争場”是有益的。在這(zhè)種情況下(xià),“手勢競争場”将隻有一(yī)個識别器,并且水平拖動将被立即識别,這(zhè)意味着水平移動的第一(yī)個像素可(kě)以被視(shì)為(wèi)拖動,用戶不需要(yào)等待進一(yī)步的手勢消歧。

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:Flutter 動畫(huà)
上(shàng)一(yī)篇:Flutter 添加交互