<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 關(guān)于flutter模擬手勢(shì)的信息

            Flutter(五)手勢(shì)GestureDetector

            在Android中,每一個(gè) View 都可以通過 onTouch 方法重寫其觸摸事件,也可以通過 setOnClickListener 方法來給 View 設(shè)置點(diǎn)擊事件。但是Flutter中除了少部分組件,如 Button 相關(guān)的組件可以直接通過 onPressed 實(shí)現(xiàn)點(diǎn)擊事件。其余組件想實(shí)現(xiàn)點(diǎn)擊、長(zhǎng)按等事件,都需要借助 GestureDetector 來實(shí)現(xiàn)手勢(shì)監(jiān)聽

            目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、長(zhǎng)治網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

            下面介紹比較常用的手勢(shì)如 onTap (點(diǎn)擊)、 onDoubleTap (雙擊)、 onLongPress (長(zhǎng)按)

            小球跟隨手指移動(dòng)的實(shí)現(xiàn)應(yīng)該是屬于各種移動(dòng)端框架作為了解拖動(dòng)手勢(shì)的的典型案例,下面我們來看看用flutter如何實(shí)現(xiàn)小球跟隨手指移動(dòng)

            拖動(dòng)手勢(shì)主要由 onPanDown (手指按下)、 onPanUpdate (手指滑動(dòng))、 onPanEnd (滑動(dòng)結(jié)束)構(gòu)成

            縮放手勢(shì)需要用到 onScaleUpdate 方法,下面是一個(gè)簡(jiǎn)單的圖片縮放的實(shí)現(xiàn)

            Flutter手勢(shì)(粘貼即用 flutter 1.22.6)

            import 'package:flutter/material.dart';

            void main() = runApp(MyApp());

            class MyAppextends StatelessWidget {

            // This widget is the root of your application.

            @override

            Widgetbuild(BuildContext context) {

            return MaterialApp(

            title:'Flutter Demo',

            ? theme:ThemeData(

            primarySwatch: Colors.blue, splashColor: Colors.transparent),

            ? home:HYHomePage(),

            );

            }

            }

            class HYHomePageextends StatelessWidget {

            @override

            Widgetbuild(BuildContext context) {

            return Scaffold(

            appBar:AppBar(

            title:Text("列表測(cè)試"),

            ? ),

            ? body:GestureDemo(),

            ? // Center(

            //? child: Stack(

            //? ? alignment: Alignment.center,

            //? ? children: [

            //? ? ? GestureDetector(

            //? ? ? ? onTapDown: (details) {

            //? ? ? ? ? print("outer click");

            //? ? ? ? },

            //? ? ? ? child: Container(

            //? ? ? ? ? width: 200,

            //? ? ? ? ? height: 200,

            //? ? ? ? ? color: Colors.yellow,

            //? ? ? ? ? alignment: Alignment.center,

            //? ? ? ? ),

            //? ? ? ),

            //? ? ? IgnorePointer(

            //? ? ? ? child: GestureDetector(

            //? ? ? ? ? onTapDown: (details) {

            //? ? ? ? ? ? print("inner click");

            //? ? ? ? ? },

            //? ? ? ? ? child: Container(

            //? ? ? ? ? ? width: 100,

            //? ? ? ? ? ? height: 100,

            //? ? ? ? ? ? color: Colors.red,

            //? ? ? ? ? ),

            //? ? ? ? ),

            //? ? ? )

            //? ? ],

            //? ),

            // ),

            );

            }

            }

            class GestureDemoextends StatelessWidget {

            const GestureDemo({

            Key key,

            }) :super(key: key);

            @override

            Widgetbuild(BuildContext context) {

            return Center(

            child:GestureDetector(

            onTapDown: (details) {

            print("手指按下");

            ? ? ? print(details.globalPosition);

            ? ? ? print(details.localPosition);

            ? ? },

            ? ? onTapUp: (details) {

            print("手指抬起");

            ? ? },

            ? ? onTapCancel: () {

            print("手勢(shì)取消");

            ? ? },

            ? ? onTap: () {

            print("手勢(shì)點(diǎn)擊");

            ? ? },

            ? ? onDoubleTap: () {

            print("手指雙擊");

            ? ? },

            ? ? onLongPress: () {

            print("長(zhǎng)按手勢(shì)");

            ? ? },

            ? ? onPanUpdate: (value){

            print('當(dāng)前我在滑動(dòng)$value');

            ? ? },

            ? ? child:Container(

            width:200,

            ? ? ? height:200,

            ? ? ? color: Colors.orange,

            ? ? ),

            ? ),

            );

            }

            }

            class ListenerDemoextends StatelessWidget {

            const ListenerDemo({

            Key key,

            }) :super(key: key);

            @override

            Widgetbuild(BuildContext context) {

            return Listener(

            onPointerDown: (event) {

            print("指針按下:$event");

            ? ? print(event.position);

            ? ? print(event.localPosition);

            ? },

            ? onPointerMove: (event) {

            //? ? ? ? ? ? print("指針移動(dòng):$event");

            ? },

            ? onPointerUp: (event) {

            //? ? ? ? ? ? print("指針抬起:$event");

            ? },

            ? child:Container(

            width:200,

            ? ? height:200,

            ? ? color: Colors.red,

            ? ),

            );

            }

            }

            Flutter 之 交互

            手勢(shì)操作在 Flutter 中分為兩類:

            第一類是原始的指針事件(Pointer Event),即原生開發(fā)中常見的觸摸事件,表示屏幕上觸摸(或鼠標(biāo)、手寫筆)行為觸發(fā)的位移行為;

            第二類則是手勢(shì)識(shí)別(Gesture Detector),表示多個(gè)原始指針事件的組合操作,如點(diǎn)擊、雙擊、長(zhǎng)按等,是指針事件的語義化封裝。

            指針事件表示用戶交互的原始觸摸數(shù)據(jù),如手指接觸屏幕 PointerDownEvent、手指在屏幕上移動(dòng) PointerMoveEvent、手指抬起 PointerUpEvent,以及觸摸取消 PointerCancelEvent。在手指接觸屏幕,觸摸事件發(fā)起時(shí),F(xiàn)lutter 會(huì)確定手指與屏幕發(fā)生接觸的位置上究竟有哪些組件,并將觸摸事件交給最內(nèi)層的組件去響應(yīng)。事件會(huì)從這個(gè)最內(nèi)層的組件開始,沿著組件樹向根節(jié)點(diǎn)向上冒泡分發(fā)。通過 hitTestBehavior 去調(diào)整組件在命中測(cè)試期內(nèi)應(yīng)該如何表現(xiàn),比如把觸摸事件交給子組件,或者交給其視圖層級(jí)之下的組件去響應(yīng)。關(guān)于組件層面的原始指針事件的監(jiān)聽,F(xiàn)lutter 提供了 Listener Widget,可以監(jiān)聽其子 Widget 的原始指針事件。

            Listener(

            child: Container(

            color: Colors.black,

            width: 300,

            height: 300,

            ),

            onPointerDown: (event) = print("down $event"),// 手勢(shì)按下回調(diào)

            onPointerMove:? (event) = print("move $event"),// 手勢(shì)移動(dòng)回調(diào)

            onPointerUp:? (event) = print("up $event"),// 手勢(shì)抬起回調(diào)

            );

            Gesture 是手勢(shì)語義的抽象,而如果我們想從組件層監(jiān)聽手勢(shì),則需要使用 GestureDetector 。GestureDetector 是一個(gè)處理各種高級(jí)用戶觸摸行為的 Widget,與 Listener 一樣,也是一個(gè)功能性組件。

            GestureDetector(// 手勢(shì)識(shí)別

            ? ? child: Container(color: Colors.red,width: 50,height: 50),// 紅色子視圖

            ? ? onTap: ()=print("Tap"),// 點(diǎn)擊回調(diào)

            ? ? onDoubleTap: ()=print("Double Tap"),// 雙擊回調(diào)

            ? ? onLongPress: ()=print("Long Press"),// 長(zhǎng)按回調(diào)

            ? ? onPanUpdate: (e) {// 拖動(dòng)回調(diào)

            ? ? ? setState(() {

            ? ? ? ? // 更新位置

            ? ? ? ? _left += e.delta.dx;

            ? ? ? ? _top += e.delta.dy;

            ? ? ? });

            ? ? },

            ? ),

            Flutter了解之手勢(shì)

            描述了屏幕上指針(觸摸、鼠標(biāo)、觸控筆)的位置和移動(dòng)。

            Flutter中可以使用Listener(功能性組件)來監(jiān)聽原始觸摸事件

            例1

            例2

            例3

            忽略PointerEvent

            手勢(shì): 描述由一個(gè)或多個(gè)指針移動(dòng)組成的語義動(dòng)作,如拖動(dòng)、縮放、雙擊等。

            Material大多數(shù)widget已經(jīng)對(duì)tap或手勢(shì)做出了響應(yīng)。 例如 IconButton和 FlatButton 響應(yīng)單擊,ListView響應(yīng)滑動(dòng)事件觸發(fā)滾動(dòng)。

            用于手勢(shì)識(shí)別的功能性組件,通過它可以來識(shí)別各種手勢(shì)。

            例(單擊)

            例(添加Material觸摸水波效果 InkWell組件)

            例(滑動(dòng)關(guān)閉 Dismissable組件)

            例(單擊、雙擊、長(zhǎng)按)

            例(滑動(dòng))

            例(掃動(dòng)---單一方向)

            例(縮放)

            GestureRecognizer是一個(gè)抽象類。

            一種手勢(shì)的識(shí)別器對(duì)應(yīng)一個(gè)GestureRecognizer的子類。

            由于手勢(shì)競(jìng)爭(zhēng)最終只有一個(gè)勝出者,所以,當(dāng)有多個(gè)手勢(shì)識(shí)別器時(shí),可能會(huì)產(chǎn)生沖突。

            在APP中經(jīng)常會(huì)需要一個(gè)廣播機(jī)制,用以跨頁面通知。比如一個(gè)需要登錄的APP中,頁面會(huì)關(guān)注用戶登錄或注銷事件,來進(jìn)行一些狀態(tài)更新。

            這時(shí)候,一個(gè)事件總線便會(huì)非常有用,事件總線通常實(shí)現(xiàn)了訂閱者模式,訂閱者模式包含發(fā)布者和訂閱者兩種角色,可以通過事件總線來觸發(fā)事件和監(jiān)聽事件。

            對(duì)于一些簡(jiǎn)單的應(yīng)用,事件總線是足以滿足業(yè)務(wù)需求的,如果決定使用狀態(tài)管理包的話,一定要想清楚APP是否真的有必要使用它,防止“化簡(jiǎn)為繁”、過度設(shè)計(jì)。

            在widget樹中,每一個(gè)節(jié)點(diǎn)都可以分發(fā)通知,通知會(huì)沿著當(dāng)前節(jié)點(diǎn)向上傳遞,所有父節(jié)點(diǎn)都可以通過NotificationListener來監(jiān)聽通知。

            Flutter中將這種由子向父的傳遞通知的機(jī)制稱為通知冒泡(Notification Bubbling)。

            通知冒泡和用戶觸摸事件冒泡是相似的,但有一點(diǎn)不同:通知冒泡可以中止,但用戶觸摸事件不行。

            通知冒泡和Web開發(fā)中瀏覽器事件冒泡原理是相似的,都是事件從出發(fā)源逐層向上傳遞,可以在上層節(jié)點(diǎn)任意位置來監(jiān)聽通知/事件,也可以終止冒泡過程,終止冒泡后,通知將不會(huì)再向上傳遞。

            Flutter的UI框架實(shí)現(xiàn)中,除了在可滾動(dòng)組件在滾動(dòng)過程中會(huì)發(fā)出ScrollNotification之外,還有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,F(xiàn)lutter正是通過這種通知機(jī)制來使父元素可以在一些特定時(shí)機(jī)來做一些事情。

            阻止冒泡

            通知冒泡原理

            文章題目:關(guān)于flutter模擬手勢(shì)的信息
            URL標(biāo)題:http://www.jbt999.com/article14/dsdjige.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、定制開發(fā)、網(wǎng)站設(shè)計(jì)公司

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

            網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 久久亚洲免费 | 青草视频在线播放 | 91成人精品在线视频 | 777777亚洲成人 | 91精品国产91久久久久 |