首頁 > 軟體

Flutter繪圖元件之CustomPaint使用詳解

2022-03-14 13:00:39

簡介

在有些場景中,我們會需要繪製一些高度客製化化的元件,比如 UI 設計師給我們出了個難題 —— 弄一個奇形怪狀的邊框。看在 UI 設計師是一個漂亮小姐姐的份上,又不好意思說這個做不了(那樣也很沒面子)。這個時候我們就不能直接使用 Flutter 自帶的那些元件了,而是需要手動繪製元件,那就會需要用到 CuntomPaint 元件。CustomPaint 元件和前端的 Canvas差不多,允許我們在一個畫布上繪製各種元素,包括點、線、矩形、圓弧、文字、圖片等等。

CustomPaint 介紹

CustomPaint是一個 Widget,其中有三個重要的引數:

CustomPaint(
  child: childWidget(),
  foregroundPainter: foregroundPainter(),
  painter: backgroundPainter(),
)

childCustomPaint的子元件;

painterforegroundPainter:都是 CustomPainter 類,用於定義 canvas 繪製的內容。區別在於,首先是執行 painter 的繪製指令。然後是在背景上渲染 child 子元件。最後,foregroundPainter 的內容會繪製在 child 上一層。

CustomPainter提供了一個paint繪圖方法供我們繪製圖形,該方法攜帶canvassize兩個引數,其中 canvas 是畫布,size 是畫布大小。canvas 提供了很多繪製圖形的方法,比如繪製路徑、矩形、圓形和線條等等。

CustomPainter 範例

有了上面的基礎概念後,我們來一個簡單的範例來演示三個引數的層級關係。我們在backgroundPainter 上繪製一個藍色的正方形,然後傳入一個原型圖片元件作為 child,最後是在 foregroundPainter 上繪製一個半透明的紅色圓形遮住一部分圖片。最終實現效果如下圖,這樣我們可以很好地瞭解三個元素的關係。

完整程式碼如下:

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 則是在中間繪製了一個和圓形圖片同等大小的,半透明的紅色圓圈。於是就得到了我們想要的效果。

總結

本篇介紹了 CustomPaint 的基本使用,可以看到 CustomPaint使用起來並不複雜,但是真正複雜的是如何繪製圖形,這個需要有比較好的數學知識支撐(當然,如果確實不會也可以搜尋相關資料)。接下來的一篇我們來繪製一些常見的圖形。

到此這篇關於Flutter繪圖元件之CustomPaint使用詳解的文章就介紹到這了,更多相關Flutter CustomPaint內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com