在Flutter中我們在 Widget 實(shí)現(xiàn)一些手勢交互通常會(huì)使用 GestureDetector 裝飾器來實(shí)現(xiàn),但是默認(rèn)情況下, widget 是支持多點(diǎn)觸控,但是在一些特定需求下,我們不需要多點(diǎn)觸控的操作,或者多點(diǎn)觸控反而給一些功能帶來麻煩,而且比較不方便的是,多點(diǎn)觸控?zé)o法通過操作 widget 或者 GestureDetector 來屏蔽掉。查閱了官方文檔發(fā)現(xiàn)的這個(gè)玩意: RawGestureDetector

在青羊等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),青羊網(wǎng)站建設(shè)費(fèi)用合理。
大概意思是:一個(gè)小部件,用于檢測由給定手勢工廠描述的手勢。對于常用手勢,請使用GestureRecognizer。 RawGestureDetector主要在開發(fā)自己的手勢識(shí)別器時(shí)很有用。
例如:
我們可以通過RawGestureDetector來自定義手勢。
有時(shí),你可能需要禁用多點(diǎn)觸摸或在Flutter應(yīng)用程序中點(diǎn)擊小部件。 例如,有一個(gè)列表,并且一次只能單擊其中一項(xiàng)。 您不希望用戶同時(shí)用三個(gè)手指點(diǎn)擊或觸摸并立即選擇三個(gè)項(xiàng)。基本上,您要防止用戶多次點(diǎn)擊或多點(diǎn)觸摸。
我們先創(chuàng)建一個(gè)簡單的頁面,頁面加載一個(gè) ListView.builder() ,
這個(gè)列表上的cell都支持多點(diǎn)觸控,效果圖:
【圖】
Flutter允許在 GestureRecognizer 基類的幫助下創(chuàng)建自定義手勢識(shí)別器小部件。 該類已經(jīng)有兩個(gè)抽象的實(shí)現(xiàn),可以實(shí)現(xiàn)多次輕擊和單次輕擊手勢。
首先創(chuàng)建一個(gè)自定義窗口小部件,以使其子窗口小部件只能具有單一觸摸手勢。
在 build() 方法中,我們將返回僅支持單點(diǎn)觸摸手勢的手勢檢測器小部件。 因此,我們?yōu)榇藙?chuàng)建另一個(gè)名為 _SingleTouchRecognizer 的類
現(xiàn)在我們回到我們的 SingleTouchRecognizerWidget 中,通過 RawGestureDetector 裝飾器來定義我們剛才創(chuàng)建的單擊手勢檢測器:
現(xiàn)在, build() 方法返回了一個(gè) RawGestureDetector ,該 RawGestureDetector 處理 _SingleTouchRecognizer 類中的手勢。接下來,我們需要在識(shí)別器類中實(shí)現(xiàn)這些方法。我們首先覆蓋 GestureRecognizer 的 addAllowedPointer 方法。
在這里, startTrackingPointer 方法注冊了將由識(shí)別器處理的相關(guān)事件。 然后, resolve() 負(fù)責(zé)確保是否允許繼續(xù)進(jìn)行觸摸事件。
如果我們傳入 GestureDisposition.rejected ,則當(dāng)前的觸摸事件無法處理。 因此,此觸摸事件將被傳遞并允許其繼續(xù)。 但是,如果傳遞了 GestureDisposition.accepted ,則將解析觸摸事件,并且不會(huì)再調(diào)用其他事件。
通過handleEvent函數(shù)重置控制變量_p的值。
這樣就完成了_SingleTouchRecognizer類的實(shí)現(xiàn)。
現(xiàn)在,只需要將該 Widget 包裹在想要支持單點(diǎn)觸控的 widget 外層即可。
參考文獻(xiàn):
disable-multi-touch-on-a-widget-in-flutter
api.flutter.dev
在Flutter中,我們可以使用Image控件來顯示圖片,一般來講我們的圖片資源都來源于網(wǎng)絡(luò)或者本地圖片。
Flutter中的Image也是類似。
我們先來看看Image的構(gòu)造方法
下面我們來看看其常用的屬性
可以看到,其常用屬性跟前端中的css很像。
下面我們來簡單用一用Image控件
首先是必填參數(shù)image,它接收一個(gè)ImageProvider類型的值。ImageProvider是一個(gè)抽象類,他下面有下圖這些實(shí)現(xiàn)類,由下面這些實(shí)現(xiàn)類可以看出,image是可以從資源,內(nèi)存,網(wǎng)絡(luò),和文件中獲取圖片。
我們先來試試加載網(wǎng)絡(luò)圖片
首先看看NetworkImage構(gòu)造方法,很簡單,傳個(gè)url就可以了
如下:
嗯,就是這么簡單。其他3種情況使用也是類似的,自行看源碼即可。
實(shí)際上,F(xiàn)lutter給我們提供了擴(kuò)展方法,使用起來更加簡單,通常我們直接使用提供的擴(kuò)展方法即可
如下
可以看到,他們的構(gòu)造方法基本類似。
所以我們也可以這樣寫,跟上面的效果是一致的。
大致分為一下幾步
1.創(chuàng)建一個(gè)文件夾,用于存放圖片,如圖,我創(chuàng)建了一個(gè)imgs的文件夾,放了一張圖片
2.在pubspec.yaml中聲明資源,注意聲明的時(shí)候路徑和前面的-是有間隔的,不然的話會(huì)報(bào)#/properties/flutter/properties/assets: type: wanted [array] got -imgs/code.png
類似的錯(cuò)誤,聲明完成后點(diǎn)擊右上方的packages get
或
下面我們再來看看其他屬性。
width,height
寬高沒什么好說的,就是設(shè)置寬度和高度
配合color使用,用于設(shè)置顏色的混合模式。BlendMode是一個(gè)枚舉,他有很多值
詳細(xì)解析還是看官方文檔吧,值太多了,我們隨便用用
用于設(shè)置圖片的填充方式,當(dāng)圖片本身小于設(shè)置的寬高或者比父控件的寬高小時(shí),我們可以設(shè)置該屬性控制圖片的顯示。
其值的類型是BoxFit。是個(gè)枚舉
具體含義還是直接看文檔即可
設(shè)置圖片的對齊方式,接收一個(gè)Alignment類型的值,值如下,很好理解
為了方便看效果我們在外邊套了個(gè)Container,簡單的把它理解為一個(gè)容器布局就可以了,類似于html中的div或android中的Layout,我們給Container設(shè)置了寬高和背景顏色。
bottomLeft效果如下,其他的自行嘗試
相對于Image,ICON可以像web一樣使用字體圖標(biāo),并且可以使用矢量圖,無需擔(dān)心失真的問題,并且體積相對較小。
我們先來看看其構(gòu)造方法
很簡單,我們直接來用一用
默認(rèn)情況下,pubspec.yaml中uses-material-design的值為true.我們默認(rèn)就可以使用Material Design字體圖標(biāo)
Flutter是谷歌公司推出的跨終端的開發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開發(fā)語言是Dart,Dart也是谷歌開發(fā)的計(jì)算機(jī)編程語言,語法類似C,是編譯型語言:
hello world例子,打印字符串“Hello World!”:
1、沒有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個(gè)橋接層,所以界面渲染會(huì)慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶體驗(yàn)跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢所在:
Dart可以被編譯成不同平臺(tái)的本地代碼,讓Flutter不通過橋接層直接跟平臺(tái)通信,自然性能會(huì)快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰好一目了然。
3、Flutter Engine虛擬機(jī)
Flutter是依靠Flutter Engine虛擬機(jī)在iOS和Android上運(yùn)行的,F(xiàn)lutter Engine使用C/C++編寫,開發(fā)人員通過Flutter框架直接和API在內(nèi)部進(jìn)行交互,所以具有輸入低延遲和UI渲染高幀速率的特點(diǎn)。除了這特點(diǎn)之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構(gòu)建的。 中心思想是您使用小部件構(gòu)建UI。
窗口小部件根據(jù)其當(dāng)前配置和狀態(tài)描述了它們的視圖。 當(dāng)窗口小部件的狀態(tài)發(fā)生更改時(shí),窗口小部件會(huì)重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹從一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)所需的最小更改。可以直接在OS平臺(tái)提供的畫布上進(jìn)行描繪,也就是一些核心類庫直接放到虛擬機(jī)里面,調(diào)用起來更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類似安卓的ART(Android Run Time)虛擬機(jī),同樣采用AOT(Ahead of TIme)技術(shù),會(huì)在APP安裝時(shí)就編譯成機(jī)器語言,不再解釋執(zhí)行,從而優(yōu)化了APP運(yùn)行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺(tái)上Flutter也會(huì)把Skia引擎打包到APP中,從而實(shí)現(xiàn)了高效渲染。而React Native通過橋接層訪問原生UI,操作頻繁就容易出性能問題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開發(fā)框架,未來也會(huì)是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問題就是需要學(xué)習(xí)一門新的語言:Dart,而有Java或者C#語言基礎(chǔ)的程序員會(huì)比較容易學(xué)習(xí)。
眾所周知,小程序是由HTML標(biāo)簽來開發(fā)原生組件,那么首先需要將HTML做解析,這里我們將HTML通過node腳本解析成JSON字符串,再用Dart來解析JSON,映射對應(yīng)的標(biāo)簽到flutter的組件。這里先簡單介紹實(shí)現(xiàn)的功能以及展示效果,后續(xù)再詳細(xì)介紹。
為了高效解析,直接用flutter的組件名在HTML文件上開發(fā)
直接使用flutter的組件
模仿微信小程序的Api,cc對應(yīng)是微信小程序的wx
以上HTML中的例子
《使用Flutter + V8/JsCore開發(fā)小程序引擎(二)》
《使用Flutter + V8/JsCore開發(fā)小程序引擎(三)》
網(wǎng)站標(biāo)題:flutter小部件開發(fā),flutter 常用組件
本文鏈接:http://chinadenli.net/article28/dsshdjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、品牌網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站排名、網(wǎng)頁設(shè)計(jì)公司、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)