Flutter繪圖組件之CustomPaint使用詳解
簡(jiǎn)介
在有些場(chǎng)景中,我們會(huì)需要繪制一些高度定制化的組件,比如 UI 設(shè)計(jì)師給我們出了個(gè)難題 —— 弄一個(gè)奇形怪狀的邊框??丛?UI 設(shè)計(jì)師是一個(gè)漂亮小姐姐的份上,又不好意思說(shuō)這個(gè)做不了(那樣也很沒(méi)面子)。這個(gè)時(shí)候我們就不能直接使用 Flutter 自帶的那些組件了,而是需要手動(dòng)繪制組件,那就會(huì)需要用到 CuntomPaint 組件。CustomPaint 組件和前端的 Canvas差不多,允許我們?cè)谝粋€(gè)畫布上繪制各種元素,包括點(diǎn)、線、矩形、圓弧、文字、圖片等等。
CustomPaint 介紹
CustomPaint是一個(gè) Widget,其中有三個(gè)重要的參數(shù):
CustomPaint( child: childWidget(), foregroundPainter: foregroundPainter(), painter: backgroundPainter(), )
child:CustomPaint的子組件;
painter和 foregroundPainter:都是 CustomPainter 類,用于定義 canvas 繪制的內(nèi)容。區(qū)別在于,首先是執(zhí)行 painter 的繪制指令。然后是在背景上渲染 child 子組件。最后,foregroundPainter 的內(nèi)容會(huì)繪制在 child 上一層。

CustomPainter提供了一個(gè)paint繪圖方法供我們繪制圖形,該方法攜帶canvas 和size兩個(gè)參數(shù),其中 canvas 是畫布,size 是畫布大小。canvas 提供了很多繪制圖形的方法,比如繪制路徑、矩形、圓形和線條等等。
CustomPainter 示例
有了上面的基礎(chǔ)概念后,我們來(lái)一個(gè)簡(jiǎn)單的示例來(lái)演示三個(gè)參數(shù)的層級(jí)關(guān)系。我們?cè)?code>backgroundPainter 上繪制一個(gè)藍(lán)色的正方形,然后傳入一個(gè)原型圖片組件作為 child,最后是在 foregroundPainter 上繪制一個(gè)半透明的紅色圓形遮住一部分圖片。最終實(shí)現(xiàn)效果如下圖,這樣我們可以很好地了解三個(gè)元素的關(guān)系。

完整代碼如下:
import 'dart:ui';
import 'package:flutter/material.dart';
class BasicPaintPage extends StatelessWidget {
const BasicPaintPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return CustomPaint(
child: Center(
child: ClipOval(
child: Image.asset(
'images/beauty.jpeg',
width: 200,
height: 200,
fit: BoxFit.fitWidth,
),
),
),
painter: BackgroundPainter(),
foregroundPainter: ForegroundPainter(),
);
}
}
class BackgroundPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
var center = size / 2;
var paint = Paint()..color = Color(0xFF2080E5);
paint.strokeWidth = 2.0;
canvas.drawRect(
Rect.fromLTWH(center.width - 120, center.height - 120, 240, 240),
paint,
);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}
class ForegroundPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
var center = size / 2;
var paint = Paint()..color = Color(0x80F53010);
paint.strokeWidth = 2.0;
canvas.drawCircle(
Offset(center.width, center.height),
100,
paint,
);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}其中在背景繪制中我們制定了canvas 的背景色,即下面這行代碼:
canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
其他代碼就相對(duì)好理解了,BackgroundPainter 繪制了一個(gè)藍(lán)色正方形,child 是一個(gè)居中的圓形圖片,而 ForegroundPainter 則是在中間繪制了一個(gè)和圓形圖片同等大小的,半透明的紅色圓圈。于是就得到了我們想要的效果。
總結(jié)
本篇介紹了 CustomPaint 的基本使用,可以看到 CustomPaint使用起來(lái)并不復(fù)雜,但是真正復(fù)雜的是如何繪制圖形,這個(gè)需要有比較好的數(shù)學(xué)知識(shí)支撐(當(dāng)然,如果確實(shí)不會(huì)也可以搜索相關(guān)資料)。接下來(lái)的一篇我們來(lái)繪制一些常見(jiàn)的圖形。
到此這篇關(guān)于Flutter繪圖組件之CustomPaint使用詳解的文章就介紹到這了,更多相關(guān)Flutter CustomPaint內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用自定義view在指定時(shí)間內(nèi)勻速畫一條直線的實(shí)例代碼
這篇文章主要介紹了Android使用自定義view在指定時(shí)間內(nèi)勻速畫一條直線的實(shí)例代碼,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
XListView實(shí)現(xiàn)下拉刷新和上拉加載原理解析
這篇文章主要為大家解析了XListView實(shí)現(xiàn)下拉刷新和上拉加載原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android Retrofit的簡(jiǎn)單介紹和使用
這篇文章主要介紹了Android Retrofit的簡(jiǎn)單介紹和使用2017-03-03
Android SeekBar在刷新使用中需要注意的問(wèn)題
SeekBar在刷新使用中需要注意的問(wèn)題:在使用SeekBar的過(guò)程中需要注意刷新頻率,避免頻繁刷新造成的性能問(wèn)題;同時(shí),需要對(duì)SeekBar的監(jiān)聽(tīng)事件進(jìn)行適當(dāng)?shù)膬?yōu)化,減少回調(diào)次數(shù),提高響應(yīng)速度2023-05-05
android開發(fā)教程之時(shí)間對(duì)話框核心代碼
這篇文章主要介紹了android的時(shí)間對(duì)話框核心代碼,需要的朋友可以參考下2014-04-04
android實(shí)現(xiàn)人臉識(shí)別技術(shù)的示例代碼
本篇文章主要介紹了android人臉識(shí)別技術(shù)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Android studio 廣播的簡(jiǎn)單使用代碼詳解
這篇文章主要介紹了Android studio 廣播的簡(jiǎn)單使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Android實(shí)現(xiàn)的可以調(diào)整透明度的圖片查看器實(shí)例
這篇文章主要介紹了Android實(shí)現(xiàn)的可以調(diào)整透明度的圖片查看器,需要的朋友可以參考下2014-07-07
Android在listview添加checkbox實(shí)現(xiàn)原理與代碼
Android在listview添加checkbox如何實(shí)現(xiàn)一直都是新手朋友們的頭疼問(wèn)題,接下來(lái)為您詳細(xì)介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下2013-01-01
Flutter啟動(dòng)頁(yè)(閃屏頁(yè))的具體實(shí)現(xiàn)及原理詳析
這篇文章主要給大家介紹了關(guān)于Flutter啟動(dòng)頁(yè)(閃屏頁(yè))的具體實(shí)現(xiàn)及原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

