Flutter項(xiàng)目手勢(shì)運(yùn)用及單獨(dú)指針消歧問題解決方案
對(duì)于手勢(shì)的運(yùn)用
指針表示用戶與設(shè)備屏幕交互的原始數(shù)據(jù)。有四種類型的指針事件 PointerDownEvent指針觸摸屏幕上的特定位置 PointerMoveEvent指針從屏幕上的一個(gè)位置移動(dòng)到另一個(gè)位置 PointerUpEvent指針停止觸摸屏幕 PointerCancelEvent指針的輸入事件不再針對(duì)此應(yīng)用程序(事件取消)
Widget build(BuildContext context) { return new GestureDetector( onTap: _handleTap, child: new Container( child: new Center( child: new Text( _active ? 'Active' : 'Inactive', style: new TextStyle(fontSize: 32.0, color: Colors.white), ), ), width: 200.0, height: 200.0, decoration: new BoxDecoration( color: _active ? Colors.lightGreen[700] : Colors.grey[600], ), ), ); } }
當(dāng)按下指針時(shí),框架將在應(yīng)用程序上執(zhí)行_點(diǎn)擊測(cè)試_,以確定指針與屏幕相交的位置存在哪些小部件。然后,指針按下事件(以及該指針的后續(xù)事件)被分發(fā)到_命中測(cè)試_找到的最里面的小部件。從那里,這些事件將在小部件樹中彈出。這些事件將從最里面的小部件分發(fā)到小部件根路徑上的所有小部件。沒有取消或停止冒泡過程的機(jī)制。 要直接從窗口小部件層偵聽指針事件,請(qǐng)使用偵聽器窗口小部件。然而,一般來(lái)說(shuō),考慮使用手勢(shì)(如下所述)。要直接從小部件層偵聽指針事件,可以使用Listenerwidgets。
單獨(dú)指針
手勢(shì)表示可以從多個(gè)單獨(dú)指針事件(甚至多個(gè)單獨(dú)的指針)中識(shí)別的語(yǔ)義動(dòng)作(如敲擊、拖動(dòng)和縮放)。一個(gè)完整的手勢(shì)可以調(diào)度多個(gè)事件,對(duì)應(yīng)于手勢(shì)的生命周期(例如,拖動(dòng)開始、拖動(dòng)更新和拖動(dòng)結(jié)束):
class ParentWidget extends StatefulWidget { @override _ParentWidgetState createState() => new _ParentWidgetState(); } class _ParentWidgetState extends State<ParentWidget> { bool _active = false; void _handleTapboxChanged(bool newValue) { setState(() { _active = newValue; }); } @override Widget build(BuildContext context) { return new Container( child: new TapboxC( active: _active, onChanged: _handleTapboxChanged, ), ); } }
TaponTapDown指針已在特定位置與屏幕接觸onTapUp指針停止在特定位置接觸屏幕onTap tap事件觸發(fā)onTapCancel之前由指針觸發(fā)的onTapDown不會(huì)觸發(fā)tap事件 雙擊DoubleTap可在同一位置連續(xù)兩次快速點(diǎn)擊屏幕 長(zhǎng)按onLongPress指針可在同一位置長(zhǎng)時(shí)間與屏幕保持接觸 垂直拖動(dòng)onVerticalDragStart指針已接觸屏幕,并可能開始垂直移動(dòng)。onVerticalDragUpdate指針已與屏幕接觸并垂直移動(dòng)OnVerticalDragEnd先前與屏幕接觸且垂直移動(dòng)的指針不再與屏幕接觸,并在停止觸摸屏幕時(shí)以特定速度移動(dòng) 水平拖動(dòng)onHorizontalDragStart指針已觸摸屏幕,并可能開始水平移動(dòng)onHorizontalDragUpdate指針接觸屏幕并已水平移動(dòng)onHorizontalDragEnd指針(以前接觸屏幕并水平移動(dòng))不再接觸屏幕,并在停止觸摸屏幕時(shí)以特定速度移動(dòng) 要從控件層監(jiān)視手勢(shì),請(qǐng)使用手勢(shì)檢測(cè)器
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: new Center( child: new Text('Hello World', style: new TextStyle(fontSize: 32.0)), ), ); } }
如果使用“材質(zhì)組件”,大多數(shù)小部件都會(huì)響應(yīng)輕敲或手勢(shì)。例如,IconButton和FlatButton響應(yīng)按下(輕擊),ListView響應(yīng)滑動(dòng)事件以觸發(fā)滾動(dòng)。如果不使用這些小部件,但希望在單擊時(shí)具有“潑墨”效果,則可以使用InkWell。
消歧
在屏幕上的指定位置可能有多個(gè)手勢(shì)檢測(cè)器。當(dāng)指針事件流通過并試圖識(shí)別特定手勢(shì)時(shí),所有這些手勢(shì)檢測(cè)器都會(huì)監(jiān)聽指針事件流。手勢(shì)檢測(cè)器小部件確定它是哪個(gè)手勢(shì)。 當(dāng)屏幕上有多個(gè)給定指針的手勢(shì)識(shí)別器時(shí),框架通過向每個(gè)識(shí)別器添加“手勢(shì)競(jìng)爭(zhēng)場(chǎng)”來(lái)確定所需的手勢(shì)。“手勢(shì)比賽場(chǎng)”使用以下規(guī)則來(lái)確定哪個(gè)手勢(shì)獲勝 在任何時(shí)候,識(shí)別器都可以宣布失敗并離開“手勢(shì)比賽場(chǎng)”。如果“比賽場(chǎng)地”中只剩下一個(gè)標(biāo)識(shí)符,則該標(biāo)識(shí)符為獲勝者
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { //... Widget buttonSection = new Container( child: new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ buildButtonColumn(Icons.call, 'CALL'), buildButtonColumn(Icons.near_me, 'ROUTE'), buildButtonColumn(Icons.share, 'SHARE'), ], ), ); //... }
在任何時(shí)候,識(shí)別器都可以宣布勝利,這將導(dǎo)致勝利,而所有剩余的識(shí)別器都將失敗 例如,當(dāng)消除水平和垂直拖動(dòng)的歧義時(shí),兩個(gè)識(shí)別器在接收到指針向下事件時(shí)進(jìn)入“手勢(shì)競(jìng)爭(zhēng)場(chǎng)”。識(shí)別器觀察指針移動(dòng)事件。如果用戶將指針?biāo)揭苿?dòng)超過一定數(shù)量的邏輯像素,則水平識(shí)別器將宣布勝利,手勢(shì)將被解釋為水平拖動(dòng)。類似地,如果用戶垂直移動(dòng)超過一定數(shù)量的邏輯像素,則垂直識(shí)別器將宣布獲勝。 當(dāng)僅水平(或垂直)拖動(dòng)識(shí)別器時(shí),“手勢(shì)競(jìng)爭(zhēng)場(chǎng)”是有益的。在這種情況下,“手勢(shì)競(jìng)爭(zhēng)領(lǐng)域”中只有一個(gè)識(shí)別器,水平拖動(dòng)將立即被識(shí)別,這意味著第一個(gè)水平移動(dòng)的像素可以被視為拖動(dòng),用戶不需要等待進(jìn)一步的手勢(shì)消歧。
依賴包中的字體
如果包中定義的字體在內(nèi)部使用,則在創(chuàng)建文本樣式時(shí)還應(yīng)指定包參數(shù),如上面的示例所示。 包還可以提供字體文件,而無(wú)需輸入pubspec Yaml。這些文件應(yīng)位于包的lib/文件夾中。字體文件不會(huì)自動(dòng)綁定到應(yīng)用程序,應(yīng)用程序可以在聲明字體時(shí)選擇性地使用這些字體。假設(shè)a_包中有一個(gè)包:
flutter: fonts: - family: Raleway fonts: - asset: assets/fonts/Raleway-Regular.ttf - asset: packages/my_package/fonts/Raleway-Medium.ttf weight: 500
family是字體的名稱??梢栽赥extStyle的fontFamily屬性中使用它 資產(chǎn)相對(duì)于pubspec yaml文件的路徑這些文件包含字體中的字形輪廓。構(gòu)建應(yīng)用程序時(shí),這些文件將包含在應(yīng)用程序的資產(chǎn)包中。 可以設(shè)置字體的粗細(xì)、傾斜和其他樣式 weight屬性指定字體的粗細(xì)。值范圍是100到900(100的倍數(shù))的整數(shù)。這些值對(duì)應(yīng)于FontWeight,可用于TextStyle的FontWeight屬性 樣式指定字體是斜體還是普通字體。相應(yīng)的值為斜體和普通值。這些值對(duì)應(yīng)于fontStyle可用于TextStyle的fontStyle TextStyle屬性
import 'package:flutter/material.dart'; const String words1 = "Almost before we knew it, we had left the ground."; const String words2 = "A shining crescent far beneath the flying vessel."; const String words3 = "A red flair silhouetted the jagged edge of a wing."; const String words4 = "Mist enveloped the ship three hours out from port."; void main() { runApp(new MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Fonts', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new FontsPage(), ); } }
在Flutter應(yīng)用程序中使用字體需要兩個(gè)步驟。首先在pubspec.yaml中聲明它們,以確保它們包含在應(yīng)用程序中。
以上就是Flutter項(xiàng)目手勢(shì)運(yùn)用及單獨(dú)指針消歧問題解決方案的詳細(xì)內(nèi)容,更多關(guān)于Flutter手勢(shì)運(yùn)用單獨(dú)指針消歧的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- flutter中的資源和圖片加載示例詳解
- flutter的導(dǎo)航和路由使用示例詳解
- Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例
- 大型項(xiàng)目里Flutter測(cè)試應(yīng)用實(shí)例集成測(cè)試深度使用詳解
- Flutter Widget移動(dòng)UI框架使用Material和密匙Key實(shí)戰(zhàn)
- Flutter交互并使用小工具管理其狀態(tài)widget的state詳解
- Flutter框架解決盒約束widget和assets里加載資產(chǎn)技術(shù)
- Flutter 重構(gòu)屬性透?jìng)骷昂瘮?shù)透?jìng)魇褂檬纠?/a>
相關(guān)文章
Android利用Fragment實(shí)現(xiàn)Tab選項(xiàng)卡效果
這篇文章主要為大家詳細(xì)介紹了Android利用Fragment實(shí)現(xiàn)Tab選項(xiàng)卡效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android xmlns 的作用及其自定義實(shí)例詳解
這篇文章主要介紹了 Android xmlns 的作用及其自定義實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06Android Studio實(shí)現(xiàn)單選對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)單選對(duì)話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Android Jetpack組件支持庫(kù)DataBinding與ViewModel與LiveData及Room
Jetpack是一個(gè)由多個(gè)技術(shù)庫(kù)組成的套件,可幫助開發(fā)者遵循最佳做法,減少樣板代碼并編寫可在各種Android版本和設(shè)備中一致運(yùn)行的代碼,讓開發(fā)者精力集中編寫重要的代碼2022-09-09