網站首頁 編程語言 正文
對于手勢的運用
指針表示用戶與設備屏幕交互的原始數據。有四種類型的指針事件 PointerDownEvent指針觸摸屏幕上的特定位置 PointerMoveEvent指針從屏幕上的一個位置移動到另一個位置 PointerUpEvent指針停止觸摸屏幕 PointerCancelEvent指針的輸入事件不再針對此應用程序(事件取消)
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],
),
),
);
}
}
當按下指針時,框架將在應用程序上執行_點擊測試_,以確定指針與屏幕相交的位置存在哪些小部件。然后,指針按下事件(以及該指針的后續事件)被分發到_命中測試_找到的最里面的小部件。從那里,這些事件將在小部件樹中彈出。這些事件將從最里面的小部件分發到小部件根路徑上的所有小部件。沒有取消或停止冒泡過程的機制。 要直接從窗口小部件層偵聽指針事件,請使用偵聽器窗口小部件。然而,一般來說,考慮使用手勢(如下所述)。要直接從小部件層偵聽指針事件,可以使用Listenerwidgets。
單獨指針
手勢表示可以從多個單獨指針事件(甚至多個單獨的指針)中識別的語義動作(如敲擊、拖動和縮放)。一個完整的手勢可以調度多個事件,對應于手勢的生命周期(例如,拖動開始、拖動更新和拖動結束):
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事件觸發onTapCancel之前由指針觸發的onTapDown不會觸發tap事件 雙擊DoubleTap可在同一位置連續兩次快速點擊屏幕 長按onLongPress指針可在同一位置長時間與屏幕保持接觸 垂直拖動onVerticalDragStart指針已接觸屏幕,并可能開始垂直移動。onVerticalDragUpdate指針已與屏幕接觸并垂直移動OnVerticalDragEnd先前與屏幕接觸且垂直移動的指針不再與屏幕接觸,并在停止觸摸屏幕時以特定速度移動 水平拖動onHorizontalDragStart指針已觸摸屏幕,并可能開始水平移動onHorizontalDragUpdate指針接觸屏幕并已水平移動onHorizontalDragEnd指針(以前接觸屏幕并水平移動)不再接觸屏幕,并在停止觸摸屏幕時以特定速度移動 要從控件層監視手勢,請使用手勢檢測器
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)),
),
);
}
}
如果使用“材質組件”,大多數小部件都會響應輕敲或手勢。例如,IconButton和FlatButton響應按下(輕擊),ListView響應滑動事件以觸發滾動。如果不使用這些小部件,但希望在單擊時具有“潑墨”效果,則可以使用InkWell。
消歧
在屏幕上的指定位置可能有多個手勢檢測器。當指針事件流通過并試圖識別特定手勢時,所有這些手勢檢測器都會監聽指針事件流。手勢檢測器小部件確定它是哪個手勢。 當屏幕上有多個給定指針的手勢識別器時,框架通過向每個識別器添加“手勢競爭場”來確定所需的手勢。“手勢比賽場”使用以下規則來確定哪個手勢獲勝 在任何時候,識別器都可以宣布失敗并離開“手勢比賽場”。如果“比賽場地”中只剩下一個標識符,則該標識符為獲勝者
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'),
],
),
);
//...
}
在任何時候,識別器都可以宣布勝利,這將導致勝利,而所有剩余的識別器都將失敗 例如,當消除水平和垂直拖動的歧義時,兩個識別器在接收到指針向下事件時進入“手勢競爭場”。識別器觀察指針移動事件。如果用戶將指針水平移動超過一定數量的邏輯像素,則水平識別器將宣布勝利,手勢將被解釋為水平拖動。類似地,如果用戶垂直移動超過一定數量的邏輯像素,則垂直識別器將宣布獲勝。 當僅水平(或垂直)拖動識別器時,“手勢競爭場”是有益的。在這種情況下,“手勢競爭領域”中只有一個識別器,水平拖動將立即被識別,這意味著第一個水平移動的像素可以被視為拖動,用戶不需要等待進一步的手勢消歧。
依賴包中的字體
如果包中定義的字體在內部使用,則在創建文本樣式時還應指定包參數,如上面的示例所示。 包還可以提供字體文件,而無需輸入pubspec Yaml。這些文件應位于包的lib/文件夾中。字體文件不會自動綁定到應用程序,應用程序可以在聲明字體時選擇性地使用這些字體。假設a_包中有一個包:
flutter: fonts: - family: Raleway fonts: - asset: assets/fonts/Raleway-Regular.ttf - asset: packages/my_package/fonts/Raleway-Medium.ttf weight: 500
family是字體的名稱。可以在TextStyle的fontFamily屬性中使用它 資產相對于pubspec yaml文件的路徑這些文件包含字體中的字形輪廓。構建應用程序時,這些文件將包含在應用程序的資產包中。 可以設置字體的粗細、傾斜和其他樣式 weight屬性指定字體的粗細。值范圍是100到900(100的倍數)的整數。這些值對應于FontWeight,可用于TextStyle的FontWeight屬性 樣式指定字體是斜體還是普通字體。相應的值為斜體和普通值。這些值對應于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應用程序中使用字體需要兩個步驟。首先在pubspec.yaml中聲明它們,以確保它們包含在應用程序中。
原文鏈接:https://juejin.cn/post/7179250734016233531
相關推薦
- 2022-08-15 數據結構之有頭鏈表的實現
- 2022-07-30 .NetCore使用過濾器實現登錄權限認證的方法小結_實用技巧
- 2023-07-03 Docker之容器導出為鏡像問題_docker
- 2022-11-25 Python?RawString與open文件的newline換行符遇坑解決_python
- 2022-03-24 redis如何設置key的有效期_Redis
- 2022-09-27 詳解adb工具的基本使用_Android
- 2023-07-06 mybatis-plus 3.5.x Cannot resolve method ‘setUseDe
- 2022-06-26 ASP.NET?Core中間件會話狀態讀寫及生命周期示例_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支