Flutter繪制之路徑聯(lián)合詳解
前言
在Flutter繪制中,path路徑可謂是繪制中的核心,理論上,通過path路徑可以繪制出任意的二維圖形,掌握path路徑的繪制,就相當于掌握了繪制的核心,今天介紹一個路徑繪制中的基本常用操作,路徑聯(lián)合,將兩個path路徑通過特定的方式合成為一個新的path路徑。
方法
路徑聯(lián)合的核心方法為Path類里的一個靜態(tài)combine()方法,如下:
// 通過path1和path2路徑的到新的路徑p Path path = Path.combine(PathOperation operation, Path path1, Path path2);
方法體有三個入?yún)ⅲ謩e為聯(lián)合方式、path1、path2 ,通過聯(lián)合方式將path1和path2進行聯(lián)合返回一個新path,具體的聯(lián)合方式都有哪些呢,那就看下PathOperation這個類。
點進源碼發(fā)現(xiàn)PathOperation是一個枚舉類型,一共有5個類型,也就是有5種聯(lián)合方式。如下:
enum PathOperation {
/// 得到path1單獨區(qū)域 也可理解為path1-path2差集
difference,
/// 得到path2單獨區(qū)域 同理
reverseDifference,
/// 得到 path1&path2的交集區(qū)域
intersect,
/// 得到 path1&path2的補集區(qū)域
xor,
/// 得到 path1&path2的并集區(qū)域
union,
}如果path1和path2路徑有重合的部分,通過以上方式分別可以得到不同的新path。
為了直觀體現(xiàn),我們繪制以下兩個path路徑的圓形,它們之間有重合部分,也有獨立的部分。
兩個圓環(huán)重疊在一起,那么這時候我們就可以通過上面的五種路徑聯(lián)合方式獲取到這兩個個圓環(huán)中的任意交叉的圖。
注:通過聯(lián)合得到的path路徑都是一個閉合路徑,原始路徑如果是非閉合路徑,會默認閉合,再進行聯(lián)合。

上面xor的聯(lián)合方式再畫筆為線條時看不出區(qū)別,將畫筆設(shè)為填充,就發(fā)現(xiàn)其實雖然看起來一樣,但是路徑已經(jīng)發(fā)生改變。
總結(jié)下5種聯(lián)合方式:2個取單獨自己的,2個分別取相同的部分和不同的部分,1個我全都要。
其實通過這5種聯(lián)合功能,我們就可以輕松的繪制出一些比較復雜的圖形,比如下面的例子:
太極
太極圖正??梢杂秘惾麪柷€或弧線繪制,但是通過路徑聯(lián)合方式就會變得非常簡單,只需要繪制圓和矩形就行了。
首先我們繪制一個黑色圓,

其次利用矩形區(qū)域和圓進行路徑聯(lián)合得到半圓區(qū)域填充白色,

最后再繪制兩個小圓,添加兩個太極眼,完成。

只需簡單的三步我們就畫出了太極圖,并且使用的都是現(xiàn)成的基礎(chǔ)幾何圖形。
核心代碼:
// 大圓直徑
double r = 200;
Path pathA = Path();
pathA.addOval(Rect.fromCenter(center: Offset.zero, width: r, height: r));
// 黑白小圓
Path pathB = Path();
pathB.addOval(Rect.fromCenter(center: Offset(0, r / 4), width: r / 2, height: r / 2));
Path pathC = Path();
pathC.addOval(Rect.fromCenter(center: Offset(0, -r / 4), width: r / 2, height: r / 2));
// 輔助路徑
Path pathD = Path();
pathD.addRect(Rect.fromCenter(center: Offset(r / 4, 0), width: r / 2, height: r));
canvas.drawPath(pathA, paint
..color = Colors.black
..style = PaintingStyle.fill);
canvas.drawPath(Path.combine(PathOperation.intersect, pathA, pathD), paint..color = Colors.white);
canvas.drawPath(pathC, paint..color = Colors.white);
canvas.drawPath(pathB, paint..color = Colors.black);
// 太極眼
canvas.drawOval(
Rect.fromCenter(center: Offset(0, r / 4), width: r / 20, height: r / 20), paint..color = Colors.white);
canvas.drawOval(
Rect.fromCenter(center: Offset(0, -r / 4), width: r / 20, height: r / 20), paint..color = Colors.black);天狗食月
還可以利用路徑聯(lián)合配合動畫實現(xiàn)月圓月缺變化情況,背景利用隨機數(shù)生成隨機坐標繪制一些星星,多角形的繪制有興趣可以看下之前這篇文章 Flutter實現(xiàn)一個多邊形or多角星組件。

將圓形進行位移重合,達到天狗食月的效果,代碼就不貼了。
總結(jié)
路徑聯(lián)合一共有5種方式,雖然只有5種,但是這5種方式其實已經(jīng)涵蓋了兩個圖形的任意可能會出現(xiàn)的區(qū)域,熟練掌握路徑聯(lián)合方式,對于一些復雜的圖形我們就可以通過聯(lián)合方式巧妙的生成,希望對正在閱讀的你在Flutter繪制中有所幫助 ~
到此這篇關(guān)于Flutter繪制之路徑聯(lián)合詳解的文章就介紹到這了,更多相關(guān)Flutter路徑聯(lián)合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Service服務(wù)不被停止詳解及實現(xiàn)
這篇文章主要介紹了Android Service服務(wù)不被停止詳解及實現(xiàn)的相關(guān)資料,有很多應用在設(shè)置運行中會被直接停止掉,這里就提供一個方法一直運行,需要的朋友可以參考下2016-11-11
Flutter?將Dio請求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫的實現(xiàn)方案
這篇文章主要介紹了Flutter?將Dio請求轉(zhuǎn)發(fā)原生網(wǎng)絡(luò)庫,需要注意添加NativeNetInterceptor,如果有多個攔截器,例如LogInterceptors等等,需要將NativeNetInterceptor放到最后,需要的朋友可以參考下2022-05-05
Android編程實現(xiàn)手機自帶內(nèi)部存儲路徑的獲取方法
這篇文章主要介紹了Android編程實現(xiàn)手機自帶內(nèi)部存儲路徑的獲取方法,涉及Android針對掛載點信息的獲取技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
Android SwipeRefreshLayout仿抖音app靜態(tài)刷新
這篇文章主要為大家詳細介紹了Android SwipeRefreshLayout仿抖音app靜態(tài)刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
學習Android開發(fā)之RecyclerView使用初探
Android開發(fā)學習之路的第一課RecyclerView使用初探,感興趣的小伙伴們可以參考一下2016-07-07
Android ScrollView嵌套ExpandableListView顯示不正常的問題的解決辦法
這篇文章主要介紹了Android ScrollView嵌套ExpandableListView顯示不正常的問題的解決辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02

