CustomPaint class提供了讓用戶自定義widget的能力,它暴露了一個canvas,可以通過這個canvas來繪制widget,CustomPaint會先調用painter繪制背景,然后再繪制child,最后調用foregroundPainter來繪制前景,CustomPaint的定義如下
成都創新互聯專注于貢山企業網站建設,成都響應式網站建設公司,商城網站制作。貢山網站建設公司,為貢山等地區提供建站服務。全流程按需開發網站,專業設計,全程項目跟蹤,成都創新互聯專業和態度為您提供的服務
CustomPaint的繪制過程都將會交給CustomPainter來完成,CustomPainter是個抽象接口,在子類化CustomPainter的時候必須要重寫它的 paint 跟 shouldRepaint 接口,可以根據自己的場景來選擇性的重寫 hitTest 跟 shouldRebuildSemantics 方法。
canvas--畫布,真正的繪制是由canvas跟paint來完成的,畫布提供了各種繪制的接口來繪制圖形,除此以外畫布還提供了平移、縮放、旋轉等矩陣變換接口,畫布都有固定大小跟形狀,還可以使用畫布提供的裁剪接口來裁剪畫布的大小形狀等等。
常用的繪制接口有 更多請查看官方文檔
Paint---筆畫,是用來設置在畫布上面繪制圖形時的一些筆畫屬性,如:顏色、線寬、繪制模式、抗鋸齒等等。常用屬性有 更多請查看官方文檔
color : 設置畫筆顏色
isAntiAlias : 設置畫筆是否扛鋸齒
shader : 著色器,填充形狀或者畫線時用到,如果沒設置將會使用color
strokeWidth : 設置畫筆畫線寬度
style :繪制模式,畫線或充滿
下面這個例子來自于官方,通過 CustomPaint 畫出了一個藍天跟太陽出來
效果如下:
描述了屏幕上指針(觸摸、鼠標、觸控筆)的位置和移動。
Flutter中可以使用Listener(功能性組件)來監聽原始觸摸事件
例1
例2
例3
忽略PointerEvent
手勢: 描述由一個或多個指針移動組成的語義動作,如拖動、縮放、雙擊等。
Material大多數widget已經對tap或手勢做出了響應。 例如 IconButton和 FlatButton 響應單擊,ListView響應滑動事件觸發滾動。
用于手勢識別的功能性組件,通過它可以來識別各種手勢。
例(單擊)
例(添加Material觸摸水波效果 InkWell組件)
例(滑動關閉 Dismissable組件)
例(單擊、雙擊、長按)
例(滑動)
例(掃動---單一方向)
例(縮放)
GestureRecognizer是一個抽象類。
一種手勢的識別器對應一個GestureRecognizer的子類。
例
由于手勢競爭最終只有一個勝出者,所以,當有多個手勢識別器時,可能會產生沖突。
例
例
在APP中經常會需要一個廣播機制,用以跨頁面通知。比如一個需要登錄的APP中,頁面會關注用戶登錄或注銷事件,來進行一些狀態更新。
這時候,一個事件總線便會非常有用,事件總線通常實現了訂閱者模式,訂閱者模式包含發布者和訂閱者兩種角色,可以通過事件總線來觸發事件和監聽事件。
對于一些簡單的應用,事件總線是足以滿足業務需求的,如果決定使用狀態管理包的話,一定要想清楚APP是否真的有必要使用它,防止“化簡為繁”、過度設計。
例
在widget樹中,每一個節點都可以分發通知,通知會沿著當前節點向上傳遞,所有父節點都可以通過NotificationListener來監聽通知。
Flutter中將這種由子向父的傳遞通知的機制稱為通知冒泡(Notification Bubbling)。
通知冒泡和用戶觸摸事件冒泡是相似的,但有一點不同:通知冒泡可以中止,但用戶觸摸事件不行。
通知冒泡和Web開發中瀏覽器事件冒泡原理是相似的,都是事件從出發源逐層向上傳遞,可以在上層節點任意位置來監聽通知/事件,也可以終止冒泡過程,終止冒泡后,通知將不會再向上傳遞。
Flutter的UI框架實現中,除了在可滾動組件在滾動過程中會發出ScrollNotification之外,還有一些其它的通知,如SizeChangedLayoutNotification、KeepAliveNotification 、LayoutChangedNotification等,Flutter正是通過這種通知機制來使父元素可以在一些特定時機來做一些事情。
例
例
例
阻止冒泡
通知冒泡原理
對于一些復雜或不規則的UI,我們可能無法使用現有的 Widget 組合去實現,比如需要一個帶動畫的進度條,
又或者是一個特殊形狀的多邊形等等,當然有時候我們可以直接用圖片去實現,但是并沒有達到我們想要
的效果,反而會讓我們產生不良的體驗。
幾乎所有的UI系統都會提供一個自繪UI的接口,這個接口通常會提供一塊2D畫布Canvas,Canvas內部封裝了
一些基本繪制的API,開發者可以通過Canvas繪制各種自定義圖形。在Flutter中,提供了一個CustomPaint Widget,
它可以結合一個畫筆CustomPainter來實現繪制自定義圖形。
我們看看 CustomPaint 構造函數:
1.painter: 背景畫筆,會顯示在子節點后面;
2.foregroundPainter: 前景畫筆,會顯示在子節點前面
3.size:當child為null時,代表默認繪制區域大小,如果有child則忽略此參數,畫布尺寸則為child尺寸。如果有child但是想指定畫布為特定大小,可以使用SizeBox包裹CustomPaint實現。
4.isComplex:是否復雜的繪制,如果是,Flutter會應用一些緩存策略來減少重復渲染的開銷。
5.willChange:和isComplex配合使用,當啟用緩存時,該屬性代表在下一幀中繪制是否會改變。
可以看到,繪制時我們需要提供前景或者背景畫筆,兩者也可以同時提供,
我們的畫筆需要繼承 CustomPainter 類,我們在畫筆類中實現真正的繪制邏輯。
顧名思義畫布的意思,我們繪制布局當然是在一張畫布上進行繪制,畫布為我們繪制圖形提供了很多方法。(熟悉畫布的就無需再看了)
在繪制之前我們需要準備畫筆 Paint,就如畫畫一樣,你用什么筆就能畫什么樣的畫,在Paint中,
我們可以配置畫筆的各種屬性如粗細、顏色、樣式等。如:
好了,繼承CustomPainter類,然后準備好畫筆,就可以在畫布上盡情的揮灑了!
寫的挺簡單的,就是介紹了一下自定義view的準備工作以及畫布畫筆的功能,具體實戰請看下一篇博客。
Element管理Widget和RenderObject。
widget保持顯示當前的頁面狀態,當widget產生點擊等交互,調用setState()改變element中管理的state,
Flutter支持穩定的桌面設備開發已經一段時間了,不得不說,Flutter多平臺支持的特性真的很香。我本人并沒有任何桌面開發的經驗,但仍然使用Flutter開發出了一個桌面版小程序,功能很簡單,就是對輸入的json做格式化處理和轉模型。
話不多說,先來看看實際效果。 項目源碼地址
開發環境如下:
Flutter : 2.8.1
Dart : 2.15.1
IDE : VSCode
JSON作為我們日常開發工作中經常要打交道的一種數據格式,它共有6種數據類型: null , num , string , object , array , bool 。我們勢必對它又愛又恨。愛他因為他作為數據處理的一種格式確實非常方便簡潔。但是在我們做Flutter開發中,又需要接觸到json解析時,就會感覺非常棘手,因為flutter沒有反射,導致json轉模型這塊需要手寫那繁雜的映射關系。就像下面這樣子。
數據量少還能接受,一旦量大,那么光手寫這個解析方法都能讓你懷疑人生。更何況手寫還有出錯的可能。好在官方有個工具**json_serializable**可以自動生成這塊轉換代碼,也解決了flutter界json轉模型的空缺。當然,業界也有專門解析json的網站,可以自動生成dart代碼,使用者在生成后復制進項目中即可,也是非常方便的。
本項目以json解析為切入點,和大家一起來看下flutter是如何開發桌面應用的。
要讓我們的flutter項目支持桌面設備。我們首先需要修改下flutter的設置。如下,讓我們的項目支持 windows 和 macos 系統。
接下來使用 flutter create 命令創建我們的模版工程。
創建完項目后,我們就可以 run 起來了。
先來看下整體界面,界面四塊,分別為功能模塊、文件選擇模塊、輸入模塊、輸出模塊。
我們在新建一個桌面應用時,默認的模版又一個Appbar,此時應用可以用鼠標拖拽移動,放大縮小,還可以縮到很小。但是,我們一旦去掉這個導航欄,那么窗口就不能用鼠標拖動了,并且我們往往不希望用戶將我們的窗口縮放的很小,這會導致頁面異常,一些重要信息都展示不全。因此這里需要借助第三方組件 bitsdojo_window 。通過 bitsdojo_window ,我們可以實現窗口的定制化,拖動,最小尺寸,最大尺寸,窗口邊框,窗口頂部放大、縮小、關閉的按鈕等。
通過 InkWell 組件,可以捕捉到手勢、鼠標、觸控筆的移動和停留位置
這個功能是鼠標移動后的UI交互界面。要在窗口上顯示一個提示框,可以使用 Overlay 。需要注意的是,由于在 Overlay 上的 text 的根結點不是 Material 風格的組件,因此會出現黃色的下劃線。因此一定要用 Material 包一下 text 。并且你必須給創建的 OverlayEntry 一個位置,否則它將全屏顯示。
讀取說表拖拽的文件一開始想嘗試使用 InkWell 組件,但是這個組件無法識別拖拽中的鼠標,并且也無法從中拿到文件信息。因此放棄。后來從文章《Flutter-2天寫個桌面端APP》中發現一個可讀取拖拽文件的組件 desktop_drop ,能滿足要求。
使用開源組件 file_picker ,選完圖片后的操作和拖拽選擇圖片后的操作一致。
Textfield 如果要顯示富文本,那么需要自定義 TextEditingController 。并重寫 buildTextSpan 方法。
在做導出功能時遇到下列報錯,保存提示為沒有權限訪問對應目錄下的文件。
通過Apple的開發文檔找到有關權限問題的說明。其中有個授權私鑰的key為 com.apple.security.files.downloads.read-write ,表示 對用戶的下載文件夾的讀/寫訪問權限 。那么,使用Xcode打開Flutter項目中的mac應用,修改工程目錄下的 DebugProfile.entitlements 文件,向 entitlements 文件中添加 com.apple.security.files.downloads.read-write ,并將值設置為YES,保存后重啟Flutter項目。發現已經可以向下載目錄中讀寫文件了。
當然,這是正常操作。還有個騷操作就是關閉系統的沙盒機制。將 entitlements 文件的 App Sandbox 設置為NO。這樣我們就可以訪問任意路徑了。當然關閉應用的沙盒也就相當于關閉了應用的防護機制,因此這個選項慎用。
原文地址:
當前題目:flutter自繪鼠標,flutter自定義鍵盤
文章地址:http://vcdvsql.cn/article26/dsiidcg.html
成都網站建設公司_創新互聯,為您提供做網站、外貿建站、網站建設、微信小程序、Google、搜索引擎優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯