[Flutter]手勢識別

閱讀時間約 9 分鐘

GestureDetector

onTap、onDoubleTap和onLongPress

class _GestureTestState extends State<GestureTest> {
String _operation = "No detected!"; //事件名稱
@override
Widget build(BuildContext context) {
return Center(
child: GestureDetector(
child: Container(
alignment: Alignment.center,
color: Colors.red,
width: 200.0,
height: 100.0,
child: Text(
_operation,
style: TextStyle(color: Colors.white),
),
),
onTap: () => updateText("Tap"), //點擊
onDoubleTap: () => updateText("DoubleTap"), //雙點擊
onLongPress: () => updateText("LongPress"), //長按
),
);
}

void updateText(String text) {
//更新事件名稱
setState(() {
_operation = text;
});
}
}


onPanDown、onPanUpdate和onPanEnd

class _Drag extends StatefulWidget {
@override
_DragState createState() => _DragState();
}

class _DragState extends State<_Drag> with SingleTickerProviderStateMixin {
double _top = 0.0;
double _left = 0.0;

@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Positioned(
top: _top,
left: _left,
child: GestureDetector(
child: CircleAvatar(child: Text("A")),
//手指按下時會觸發此回調
onPanDown: (DragDownDetails e) {
//印出按下的位置(相對於螢幕)
print("使用者手指按下:${e.globalPosition}");
},
//手指滑動時會觸發此回調
onPanUpdate: (DragUpdateDetails e) {
setState(() {
_left += e.delta.dx;
_top += e.delta.dy;
});
},
//手指離開時會觸發此回調
onPanEnd: (DragEndDetails e){
//列印滑動結束時的速度
print(e.velocity);
},
),
)
],
);
}
}

DragDownDetails.globalPosition為按下的位置,是相對於螢幕原點的偏移;DragUpdateDetails.delta為滑動時,會觸發多次Update,而Update可以取得滑動的偏移量;DragEndDetails.velocity為抬起手指時的滑動速度(包含x、y兩個軸的),範例中並沒有處理手指抬起時的速度,常見的效果是根據使用者抬起手指時的速度做一個減速動畫。


Scale

class _Scale extends StatefulWidget {
const _Scale({Key? key}) : super(key: key);

@override
_ScaleState createState() => _ScaleState();
}

class _ScaleState extends State<_Scale> {
double _width = 100.0;

@override
Widget build(BuildContext context) {
return Center(
child: GestureDetector(
//指定寬度,高度自適應
child: Image.asset("your_image_path", width: _width),
onScaleUpdate: (ScaleUpdateDetails details) {
setState(() {
//縮放倍數在0.8到10倍之間
_width=100*details.scale.clamp(.8, 10.0);
});
},
),
);
}
}


GestureRecognizer

class _GestureRecognizer extends StatefulWidget {
const _GestureRecognizer({Key? key}) : super(key: key);

@override
_GestureRecognizerState createState() => _GestureRecognizerState();
}

class _GestureRecognizerState extends State<_GestureRecognizer> {
TapGestureRecognizer _tapGestureRecognizer = TapGestureRecognizer();
bool _toggle = false;

@override
void dispose() {
//釋放資源
_tapGestureRecognizer.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Center(
child: Text.rich(
TextSpan(
children: [
TextSpan(text: "Button"),
TextSpan(
text: "Change",
style: TextStyle(
fontSize: 30.0,
color: _toggle ? Colors.blue : Colors.red,
),
recognizer: _tapGestureRecognizer
..onTap = () {
setState(() {
_toggle = !_toggle;
});
},
),
TextSpan(text: "Button"),
],
),
),
);
}
}



avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
新增video_player 在pubspec.yaml中加入video_player。 設置權限 Android 在AndroidManifest.xml檔案中的<application>裡,加入下列代碼。 <uses-permission android:name="androi
GestureDetector( onTap: () { const snackBar = SnackBar(content: Text('Tap')); ScaffoldMessenger.of(context).showSnackBar(snackBar); },
加入套件 在pubspec.yaml添加sqflite與path_provider。 建立數據模型 id:識別欄位,唯一值為整數資料類型 name:存放名字為字串資料類型 class People { final int? id; final String? name;
首先需要在pubspec.yaml文件中添加依賴。 宣告 SharedPreferences record = await SharedPreferences.getInstance(); 寫入 //字串資料 await record.setString(key, value); //
class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: Table( columnWid
下面代碼為兩列的GridView class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return new GridView.count( cro
新增video_player 在pubspec.yaml中加入video_player。 設置權限 Android 在AndroidManifest.xml檔案中的<application>裡,加入下列代碼。 <uses-permission android:name="androi
GestureDetector( onTap: () { const snackBar = SnackBar(content: Text('Tap')); ScaffoldMessenger.of(context).showSnackBar(snackBar); },
加入套件 在pubspec.yaml添加sqflite與path_provider。 建立數據模型 id:識別欄位,唯一值為整數資料類型 name:存放名字為字串資料類型 class People { final int? id; final String? name;
首先需要在pubspec.yaml文件中添加依賴。 宣告 SharedPreferences record = await SharedPreferences.getInstance(); 寫入 //字串資料 await record.setString(key, value); //
class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: Table( columnWid
下面代碼為兩列的GridView class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return new GridView.count( cro
你可能也想看
Google News 追蹤
Thumbnail
獨白或台詞,是人物說的話。除了這之外,人物的各種動作與表情被稱為「小動作」。
Thumbnail
While App Development, the precision and variety of gesture recognition continue to grow, leading to more sophisticated and user-friendly apps.
Thumbnail
Flutter is a powerful, open-source UI software development kit created by Google.
生活實驗 七三四 是人 都避免不了 研究梳理出一套 暖和拉伸舒緩的姿態 必須好好地像鑽石一樣 鑲嵌在意識和潛意識 每天都伸出手把玩 我必須成為自己 的瑜珈老師 從200小時 開始
Thumbnail
本文來分享一些 Openpose 的控制線圖,有需要的朋友,自行運用喔。點選連結,可以直接在 Tensor Art 上看到所使用的模型與提示詞。
Thumbnail
本課程學習如何處理按鈕點擊事件並透過 Logcat 日誌輸出資訊確認按鈕邏輯是否正確。
Thumbnail
觸康健綜合課程二階課程報導,這是Touch For Health ® Level 2課程,導師是蘇志華老師。課程主要內容包括檢測方法、調和技巧、經絡輪與五行學說等,並分享了具體的實際案例和學員心得。
Thumbnail
本來沒有要瞎聊第二篇的🤗 但看到一個神秘紅點點😲 太過好奇無法控制我的右手指🫡 我就給它按下去😳 然後照著灰色區塊指示一路繼續按下去🫣 房間(?)就開好了🥵
Thumbnail
獨白或台詞,是人物說的話。除了這之外,人物的各種動作與表情被稱為「小動作」。
Thumbnail
While App Development, the precision and variety of gesture recognition continue to grow, leading to more sophisticated and user-friendly apps.
Thumbnail
Flutter is a powerful, open-source UI software development kit created by Google.
生活實驗 七三四 是人 都避免不了 研究梳理出一套 暖和拉伸舒緩的姿態 必須好好地像鑽石一樣 鑲嵌在意識和潛意識 每天都伸出手把玩 我必須成為自己 的瑜珈老師 從200小時 開始
Thumbnail
本文來分享一些 Openpose 的控制線圖,有需要的朋友,自行運用喔。點選連結,可以直接在 Tensor Art 上看到所使用的模型與提示詞。
Thumbnail
本課程學習如何處理按鈕點擊事件並透過 Logcat 日誌輸出資訊確認按鈕邏輯是否正確。
Thumbnail
觸康健綜合課程二階課程報導,這是Touch For Health ® Level 2課程,導師是蘇志華老師。課程主要內容包括檢測方法、調和技巧、經絡輪與五行學說等,並分享了具體的實際案例和學員心得。
Thumbnail
本來沒有要瞎聊第二篇的🤗 但看到一個神秘紅點點😲 太過好奇無法控制我的右手指🫡 我就給它按下去😳 然後照著灰色區塊指示一路繼續按下去🫣 房間(?)就開好了🥵