[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內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言
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
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
Thumbnail
獨白或台詞,是人物說的話。除了這之外,人物的各種動作與表情被稱為「小動作」。
生活實驗 七三四 是人 都避免不了 研究梳理出一套 暖和拉伸舒緩的姿態 必須好好地像鑽石一樣 鑲嵌在意識和潛意識 每天都伸出手把玩 我必須成為自己 的瑜珈老師 從200小時 開始
Thumbnail
本文來分享一些 Openpose 的控制線圖,有需要的朋友,自行運用喔。點選連結,可以直接在 Tensor Art 上看到所使用的模型與提示詞。
Thumbnail
本課程學習如何處理按鈕點擊事件並透過 Logcat 日誌輸出資訊確認按鈕邏輯是否正確。
Thumbnail
觸康健綜合課程二階課程報導,這是Touch For Health ® Level 2課程,導師是蘇志華老師。課程主要內容包括檢測方法、調和技巧、經絡輪與五行學說等,並分享了具體的實際案例和學員心得。
Thumbnail
本來沒有要瞎聊第二篇的🤗 但看到一個神秘紅點點😲 太過好奇無法控制我的右手指🫡 我就給它按下去😳 然後照著灰色區塊指示一路繼續按下去🫣 房間(?)就開好了🥵
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
Thumbnail
獨白或台詞,是人物說的話。除了這之外,人物的各種動作與表情被稱為「小動作」。
生活實驗 七三四 是人 都避免不了 研究梳理出一套 暖和拉伸舒緩的姿態 必須好好地像鑽石一樣 鑲嵌在意識和潛意識 每天都伸出手把玩 我必須成為自己 的瑜珈老師 從200小時 開始
Thumbnail
本文來分享一些 Openpose 的控制線圖,有需要的朋友,自行運用喔。點選連結,可以直接在 Tensor Art 上看到所使用的模型與提示詞。
Thumbnail
本課程學習如何處理按鈕點擊事件並透過 Logcat 日誌輸出資訊確認按鈕邏輯是否正確。
Thumbnail
觸康健綜合課程二階課程報導,這是Touch For Health ® Level 2課程,導師是蘇志華老師。課程主要內容包括檢測方法、調和技巧、經絡輪與五行學說等,並分享了具體的實際案例和學員心得。
Thumbnail
本來沒有要瞎聊第二篇的🤗 但看到一個神秘紅點點😲 太過好奇無法控制我的右手指🫡 我就給它按下去😳 然後照著灰色區塊指示一路繼續按下去🫣 房間(?)就開好了🥵