26.Flutter:成為Canvas繪制大師(二)

目錄傳送門:《Flutter快速上手指南》先導(dǎo)篇

接著上一篇 《Flutter:成為Canvas繪制大師(一)》,本篇繼續(xù)講解 Canvas 中的常用繪制操作。

繪制圓形drawCircle()

繪制圓形。

?? e.g.:

canvas.drawCircle(Offset(size.width / 2, size.height / 2), 100, paint);

?? 效果:

image

設(shè)置空心效果 paint..style=PaintingStyle.stroke 。

?? 效果:

image

繪制橢圓形drawOval()

需要提供一個(gè) Rect,繪制的是 Rect 的內(nèi)接矩形。

?? e.g.:

Rect rect = Rect.fromLTRB(size.width / 2 - 100, size.height / 2 - 50,
    size.width / 2 + 100, size.height / 2 + 50);
canvas.drawOval(rect, paint);

?? 效果:

image

設(shè)置空心效果 paint..style=PaintingStyle.stroke 。

?? 效果:

image

繪制圓弧drawArc()

繪制圓弧需要提供一個(gè) Rect,圓弧相當(dāng)于是 Rect 的內(nèi)接橢圓上的一段。

看下這個(gè)函數(shù)所需的參數(shù):

參數(shù) 類型 說明
rect Rect 圓弧所在橢圓的外接矩形
startAngle double 起始位置的弧度?;《戎?/td>
sweepAngle double 設(shè)置圓弧掃過多少弧度?;《戎?/td>
useCenter bool 表示是否鏈接到圓弧所在橢圓的中心
paint Paint 畫筆

?? e.g.:

Rect rect = Rect.fromCircle(
    center: Offset(size.width / 2, size.height / 2), radius: 140);
canvas.drawArc(rect, 0, math.pi / 2, true, paint);

?? 效果:

image

?? 注意,圓弧的 startAnglesweepAngle 采用弧度制。參考:弧度制。
如果你想要獲得 π 值,可以通過 dart 的 math 包下的 math.pi 獲取。

下圖是圓弧的0點(diǎn)示意圖:

image

?? 當(dāng) useCenter=true 的效果:

image

繪制陰影drawShadow()

在 Flutter 中,使用該函數(shù)你可以很方便的繪制陰影。

看看該函數(shù)的參數(shù):

參數(shù) 類型 說明
path Path 繪制陰影的路徑
color Color 陰影的顏色
elevation double 陰影高度
transparentOccluder bool 是否透明封堵器。通常需要設(shè)置為true

?? e.g.:

Path path = Path()..addRect(rect.translate(20, 0));
canvas.drawShadow(path, Colors.amberAccent, 20, true);

你看,繪制 Shadow 不需要 Paint。

?? 效果:

image

什么?看不出來有什么用?

前面加個(gè)東西看看。

?? 效果:

image

看起來矩形漂浮起來了??。

繪制顏色drawColor()

Flutter 中的 drawColor() 是個(gè)比較不容易理解的繪制操作。

為什么呢?看看它的參數(shù):

參數(shù) 類型 說明
color Color 顏色
blendMode BlendMode 色值混合模式。與此前繪制的內(nèi)容的混合。

主要就是因?yàn)榈诙€(gè)參數(shù) blendMode。

不同的值會(huì)有不同的表現(xiàn)。

在進(jìn)行混合的時(shí)候,有一個(gè)目標(biāo)色值 dst(調(diào)用drawColor()之前已經(jīng)繪制的內(nèi)容)和一個(gè)源色值 src(就是第一個(gè)參數(shù)的色值)。

混合就是,以不同的算法,根據(jù) dstsrc 計(jì)算出新的色值。

?? e.g.:

canvas.drawColor(Colors.redAccent, BlendMode.src);

?? 效果:

image

由于在調(diào)用 drawColor() 之前沒有繪制過內(nèi)容,所以混合就是和背景進(jìn)行的。

可以看到,此時(shí)模式為 BlendMode.src 時(shí),可以給整個(gè)畫布上顏色。

?? 如果此前已經(jīng)繪制了內(nèi)容:

image

加上如下代碼:

canvas.drawColor(Colors.redAccent, BlendMode.color);

?? 效果:

image

使用 BlendMode.color 模式就像給此前的繪制的內(nèi)容加了濾鏡 ??。

BlendMode 模式特別的多,可以參考官方的例子:BlendMode官方圖解

目錄傳送門:《Flutter快速上手指南》先導(dǎo)篇

如何找到我?

傳送門:CoorChice 的主頁

傳送門:CoorChice 的 Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容