国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter的自定義系列雷達(dá)圖

這篇具有很好參考價值的文章主要介紹了flutter的自定義系列雷達(dá)圖。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

自定義是flutter進(jìn)階中不可缺少的ui層知識點,這里我們來總結(jié)下:

在Flutter中,自定義繪制通常是通過使用CustomPaintCustomPainter來實現(xiàn)的。

  1. 創(chuàng)建CustomPaint組件

首先,需要創(chuàng)建一個CustomPaint組件。CustomPaint是一個Widget,它可以作為其他組件的子組件,用于提供自定義繪制的功能。創(chuàng)建CustomPaint時可以指定其子組件、前景畫筆和背景畫筆。

示例代碼:

CustomPaint(
  painter: BackgroundPainter(),
  foregroundPainter: ForegroundPainter(),
  child: Container(),
)

這里BackgroundPainterForegroundPainter是自定義的畫筆類,需要繼承CustomPainter。

  1. 創(chuàng)建自定義畫筆類

接下來,需要創(chuàng)建自定義的畫筆類。自定義畫筆類需要繼承CustomPainter類,并重寫paintshouldRepaint方法。paint方法用于實現(xiàn)繪制邏輯,而shouldRepaint方法用于決定在什么情況下需要重繪。

示例代碼:

class BackgroundPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // 繪制邏輯
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    // 是否需要重繪
    return true;
  }
}
  1. 實現(xiàn)繪制邏輯

paint方法中,可以實現(xiàn)自定義的繪制邏輯。paint方法接收兩個參數(shù):Canvas對象和Size對象。Canvas對象提供了各種繪制方法,如繪制線、矩形、圓、文本等;Size對象表示要繪制的區(qū)域的大小。

示例代碼:

void paint(Canvas canvas, Size size) {
  Paint paint = Paint()
    ..color = Colors.red
    ..strokeWidth = 5.0
    ..style = PaintingStyle.stroke;

  canvas.drawLine(Offset(0, 0), Offset(size.width, size.height), paint);
  canvas.drawRect(Rect.fromLTWH(0, 0, size.width / 2, size.height / 2), paint);
  canvas.drawCircle(Offset(size.width / 2, size.height / 2), 50, paint);
}
  1. 實現(xiàn)shouldRepaint方法

shouldRepaint方法用于決定在什么情況下需要重繪。通常,如果畫筆的屬性或者繪制數(shù)據(jù)發(fā)生改變時,需要返回true以觸發(fā)重繪。否則,返回false以避免不必要的重繪。

示例代碼:

bool shouldRepaint(CustomPainter oldDelegate) {
  // 可以根據(jù)具體情況判斷是否需要重繪
  return oldDelegate != this;
}
  1. 添加動畫和手勢

根據(jù)需要,還可以在自定義繪制中添加動畫和手勢支持。例如,可以使用AnimationControllerTween來創(chuàng)建動畫,并在paint方法中根據(jù)動畫值繪制;可以使用GestureDetector來監(jiān)聽手勢事件,并根據(jù)手勢改變繪制。

總結(jié)一下,F(xiàn)lutter中的自定義繪制主要是通過創(chuàng)建CustomPaint組件和自定義畫筆類來實現(xiàn)的。在自定義畫筆類中,需要重寫paintshouldRepaint方法來實現(xiàn)繪制邏輯和判斷是否需要重繪。此外,還可以根據(jù)需求添加動畫和手勢支持。

下面我們就一起來實現(xiàn)一個自定義雷達(dá)圖。

  1. 首先,引入所需的庫:
import 'dart:math';
import 'package:flutter/material.dart';
  1. 創(chuàng)建一個自定義的雷達(dá)圖組件RadarChart
class RadarChart extends StatelessWidget {
  final int numSides; // 邊的數(shù)量
  final List<double> values; // 每個角上的數(shù)值
  final double maxValue; // 最大值,用于歸一化數(shù)值

  RadarChart({required this.numSides, required this.values, this.maxValue = 100.0});

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      painter: RadarChartPainter(numSides: numSides, values: values, maxValue: maxValue),
      child: Container(),
    );
  }
}
  1. 創(chuàng)建自定義繪制類RadarChartPainter,繼承自CustomPainter
import 'dart:math';

import 'package:flutter/material.dart';

class RadarChartPainter extends CustomPainter {
  final int numSides;
  final List<double> values;
  final double maxValue;

  RadarChartPainter(
      {required this.numSides, required this.values, this.maxValue = 100.0});

  @override
  void paint(Canvas canvas, Size size) {
    final center = Offset(size.width / 2, size.height / 2);
    final radius = min(size.width / 2, size.height / 2);

    // 繪制雷達(dá)背景
    drawRadarBackground(canvas, center, radius);
    // 繪制雷達(dá)網(wǎng)格
    drawRadarGrid(canvas, center, radius);
    // 繪制雷達(dá)數(shù)據(jù)
    drawRadarData(canvas, center, radius);
    // 繪制數(shù)值文本
    drawTextLabels(canvas, center, radius);
  }

  void drawRadarBackground(Canvas canvas, Offset center, double radius) {
    final bgPaint = Paint()
      ..color = Colors.grey.withOpacity(0.3)
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1.0;

    final angleStep = 2 * pi / numSides;
    for (int i = 0; i < numSides; i++) {
      final x = center.dx + radius * cos(i * angleStep);
      final y = center.dy + radius * sin(i * angleStep);
      canvas.drawLine(center, Offset(x, y), bgPaint);
    }
  }

  void drawRadarGrid(Canvas canvas, Offset center, double radius) {
    final gridPaint = Paint()
      ..color = Colors.grey.withOpacity(0.3)
      ..style = PaintingStyle.stroke
      ..strokeWidth = 0.5;

    final int gridLevel = 5; // 網(wǎng)格層數(shù)
    final angleStep = 2 * pi / numSides;
    final double gridRadiusStep = radius / gridLevel;

    for (int i = 1; i <= gridLevel; i++) {
      final currentRadius = gridRadiusStep * i;
      final path = Path();
      for (int j = 0; j < numSides; j++) {
        final x = center.dx + currentRadius * cos(j * angleStep);
        final y = center.dy + currentRadius * sin(j * angleStep);

        if (j == 0) {
          path.moveTo(x, y);
        } else {
          path.lineTo(x, y);
        }
      }
      path.close();
      canvas.drawPath(path, gridPaint);
    }
  }

  void drawRadarData(Canvas canvas, Offset center, double radius) {
    final dataPaint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;

    final path = Path();
    final angleStep = 2 * pi / numSides;
    for (int i = 0; i < numSides; i++) {
      final normalizedValue = values[i] / maxValue;
      final x = center.dx + radius * normalizedValue * cos(i * angleStep);
      final y = center.dy + radius * normalizedValue * sin(i * angleStep);

      if (i == 0) {
        path.moveTo(x, y);
      } else {
        path.lineTo(x, y);
      }
    }
    path.close();
    canvas.drawPath(path, dataPaint);
  }

  void drawTextLabels(Canvas canvas, Offset center, double radius) {
    final textPainter = TextPainter(textDirection: TextDirection.ltr);

    final angleStep = 2 * pi / numSides;
    for (int i = 0; i < numSides; i++) {
      final value = values[i].toStringAsFixed(1);
      final x = center.dx + radius * cos(i * angleStep);
      final y = center.dy + radius * sin(i * angleStep);

      textPainter.text = TextSpan(
          text: value, style: TextStyle(color: Colors.black, fontSize: 12.0));
      textPainter.layout();
      textPainter.paint(canvas,
          Offset(x - textPainter.width / 2, y - textPainter.height / 2));
    }
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return true;
  }
}
  1. 使用RadarChart組件:
void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Radar Chart')),
        body: Center(
          child: SizedBox(
            width: 300,
            height: 300,
            child: RadarChart(numSides: 5, values: [50, 70, 90, 60, 80]),
          ),
        ),
      ),
    ),
  );
}

我們創(chuàng)建了一個RadarChart組件,可以自定義邊的數(shù)量和每個角上的數(shù)值。

通過自定義RadarChartPainter類,我們實現(xiàn)了繪制雷達(dá)背景、雷達(dá)數(shù)據(jù)和數(shù)值文本的功能。

看看我們實現(xiàn)的效果:

flutter的自定義系列雷達(dá)圖

老子講:“天下難事必作于易,天下大事必作于細(xì)?!?,你我共勉之!文章來源地址http://www.zghlxwxcb.cn/news/detail-488971.html

到了這里,關(guān)于flutter的自定義系列雷達(dá)圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • flutter系列之:如何自定義動畫路由

    flutter系列之:如何自定義動畫路由

    目錄 簡介 自定義跳轉(zhuǎn)使用 flutter動畫基礎(chǔ) 實現(xiàn)一個自定義的route 總結(jié) flutter中有默認(rèn)的Route組件,叫做MaterialPageRoute,一般情況下我們在flutter中進(jìn)行跳轉(zhuǎn)的話,只需要向Navigator中傳入一個MaterialPageRoute就可以了。 但是MaterialPageRoute太普通了,如果我們想要做點不同的跳轉(zhuǎn)特效

    2023年04月19日
    瀏覽(19)
  • flutter自定義系列之簡單的K線圖繪制

    flutter自定義系列之簡單的K線圖繪制

    上篇文章講了flutter自定義的相關(guān)流程, 今天繼續(xù)練習(xí)下flutter的自定義K線: 我們可以通過自定義Painter來實現(xiàn)一個簡單的K線圖界面: 創(chuàng)建一個自定義的Painter,用于繪制K線圖: 創(chuàng)建一個StatefulWidget,用于處理縮放和滾動: 在需要使用K線圖的地方,調(diào)用 KLineChart 組件并傳入

    2024年02月08日
    瀏覽(24)
  • Android進(jìn)階系列:八、自定義View之音頻抖動動效

    Android進(jìn)階系列:八、自定義View之音頻抖動動效

    ####繪制矩形抖動 我們要繪制音頻抖動的效果,矩形的高度肯定不能一樣,而是要根據(jù)聲音的大小來顯示,這里我們沒有聲音,簡單模擬一下給高度乘上for循環(huán)里的i效果如圖: 至此我們已經(jīng)知道了如何繪制多個矩形,并控制不同的高度,那我們要如何動態(tài)的控制高度呢?比如

    2024年04月25日
    瀏覽(21)
  • flutter 雷達(dá)圖

    flutter 雷達(dá)圖

    通過CustomPainter自定義雷達(dá)圖 效果如下 ?主要代碼 項目地址 :?flutter_radar: flutter 雷達(dá)圖

    2024年02月11日
    瀏覽(19)
  • gogs的自定義配置

    gogs的自定義配置

    在 GOGS 下載并安裝后,在程序目錄下建立一個 custom/conf/app.ini 的配置文件,內(nèi)容如下: nginx的轉(zhuǎn)發(fā)配置

    2024年02月17日
    瀏覽(27)
  • Java的自定義注解

    Java的自定義注解

    ????????自定義注解包括注解聲明、元注解、運行時處理器三個部分。注解聲明指定了注解的名稱、作用域、成員等信息;元注解則用來對注解進(jìn)行修飾;運行時處理器則負(fù)責(zé)在程序運行過程中處理注解,并根據(jù)注解提供的信息執(zhí)行相應(yīng)的邏輯。自定義注解在編寫框架、插

    2024年02月03日
    瀏覽(23)
  • MyBatis的自定義插件

    MyBatis 可以攔截的四大組件 Executor - 執(zhí)行器 StatementHandler - SQL 語句構(gòu)造器 ParameterHandler - 參數(shù)處理器 ResultSetHandler - 結(jié)果集處理器 效果如下 創(chuàng)建四大對象的代碼如下 首先在創(chuàng)建 Executor、StatementHandler、ParameterHandler、ResultSetHandler 四個對象時,將插件(plugins)注入 調(diào)用 Intercep

    2024年02月07日
    瀏覽(20)
  • 自定義loadbalance實現(xiàn)feignclient的自定義路由

    自定義loadbalance實現(xiàn)feignclient的自定義路由

    服務(wù)A有多個同事同時開發(fā),每個同事都在dev或者test環(huán)境發(fā)布自己的代碼,注冊到注冊中心有好幾個(本文nacos為例),這時候調(diào)用feign可能會導(dǎo)致請求到不同分支的服務(wù)上面,會出現(xiàn)一些問題,本文重點在于解決該問題 解決方案 調(diào)用流程 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)

    2024年02月11日
    瀏覽(23)
  • hive的自定義函數(shù)以及自定義加密函數(shù)

    hive的自定義函數(shù)以及自定義加密函數(shù)

    hive對于敏感數(shù)據(jù)的加密還不夠完善,現(xiàn)在開發(fā)一個udf函數(shù),自己設(shè)置密鑰(hive的加密函數(shù)等級比較低,也沒有集成自己加密的密鑰函數(shù),所以自己開發(fā)一個),如果要加密一些數(shù)據(jù)則可以自己使用特定的密鑰進(jìn)行加密解密,這樣很好的方便數(shù)據(jù)的加密下面將實現(xiàn)過程如下:

    2024年02月08日
    瀏覽(14)
  • Spring中的自定義注解

    在Spring中,注解是一種非常使用的工具。 因其強(qiáng)大的功能,極大的提高了我們開發(fā)效率。 但是當(dāng)遇到一些特殊業(yè)務(wù)時,框架自有的注解已經(jīng)不能滿足我們的需求了,這時我們就可以添加自定義注解來滿足我們的業(yè)務(wù)需求。 我們用 @interface 來聲明這是一個注解類。 另外需要在

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包