Flutter繪圖組件之CustomPaint使用詳解
簡介
在有些場景中,我們會需要繪制一些高度定制化的組件,比如 UI 設(shè)計師給我們出了個難題 —— 弄一個奇形怪狀的邊框??丛?UI 設(shè)計師是一個漂亮小姐姐的份上,又不好意思說這個做不了(那樣也很沒面子)。這個時候我們就不能直接使用 Flutter 自帶的那些組件了,而是需要手動繪制組件,那就會需要用到 CuntomPaint
組件。CustomPaint
組件和前端的 Canvas
差不多,允許我們在一個畫布上繪制各種元素,包括點、線、矩形、圓弧、文字、圖片等等。
CustomPaint 介紹
CustomPaint
是一個 Widget,其中有三個重要的參數(shù):
CustomPaint( child: childWidget(), foregroundPainter: foregroundPainter(), painter: backgroundPainter(), )
child
:CustomPaint
的子組件;
painter
和 foregroundPainter
:都是 CustomPainter
類,用于定義 canvas
繪制的內(nèi)容。區(qū)別在于,首先是執(zhí)行 painter
的繪制指令。然后是在背景上渲染 child
子組件。最后,foregroundPainter
的內(nèi)容會繪制在 child
上一層。
CustomPainter
提供了一個paint繪圖方法供我們繪制圖形,該方法攜帶canvas
和size
兩個參數(shù),其中 canvas
是畫布,size
是畫布大小。canvas
提供了很多繪制圖形的方法,比如繪制路徑、矩形、圓形和線條等等。
CustomPainter 示例
有了上面的基礎(chǔ)概念后,我們來一個簡單的示例來演示三個參數(shù)的層級關(guān)系。我們在backgroundPainter
上繪制一個藍色的正方形,然后傳入一個原型圖片組件作為 child
,最后是在 foregroundPainter
上繪制一個半透明的紅色圓形遮住一部分圖片。最終實現(xiàn)效果如下圖,這樣我們可以很好地了解三個元素的關(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);
其他代碼就相對好理解了,BackgroundPainter
繪制了一個藍色正方形,child
是一個居中的圓形圖片,而 ForegroundPainter
則是在中間繪制了一個和圓形圖片同等大小的,半透明的紅色圓圈。于是就得到了我們想要的效果。
總結(jié)
本篇介紹了 CustomPaint
的基本使用,可以看到 CustomPaint
使用起來并不復(fù)雜,但是真正復(fù)雜的是如何繪制圖形,這個需要有比較好的數(shù)學(xué)知識支撐(當(dāng)然,如果確實不會也可以搜索相關(guān)資料)。接下來的一篇我們來繪制一些常見的圖形。
到此這篇關(guān)于Flutter繪圖組件之CustomPaint使用詳解的文章就介紹到這了,更多相關(guān)Flutter CustomPaint內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flutter StatefulBuilder實現(xiàn)局部刷新實例詳解
這篇文章主要為大家介紹了Flutter StatefulBuilder實現(xiàn)局部刷新實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08深入了解Android中GestureDetector的定義與使用
Android中的GestureDetector?可以使用?MotionEvents?檢測各種手勢和事件,非常的好用。本文將會通過幾個具體的例子來講解一下GestureDetector的具體使用方法,需要的可以參考一下2023-01-01詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例)
這篇文章主要介紹了詳解RecyclerView設(shè)置背景圖片長寬一樣(以GridLayoutManager為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Android實現(xiàn)復(fù)制Assets文件到SD卡
這篇文章主要為大家詳細介紹了Android實現(xiàn)復(fù)制Assets文件到SD卡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12