IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter--画笔 CustomPainter -> 正文阅读

[移动开发]Flutter--画笔 CustomPainter

1.创建画板?CustomPaint

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: SizedBox(
          width: 400,
          height: 400,
          child: CustomPaint(painter: TestPaint(),),
        ),
      ),
    );
  }

2.创建绘画工具?CustomPainter

class TestPaint extends CustomPainter {

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawLine(Offset(size.width / 2, size.height / 2 - (size.height * 0.3)), Offset(size.width / 2, 0), circlePaint);
  }

  @override
  bool shouldRepaint(covariant TestPaint oldDelegate) {
    //和刷新有关
    return true;
  }
}

3.一些常用样式绘制示例

canvas.drawLine(Offset(size.width / 2, size.height / 2 - size.height), Offset(size.width / 2, 0), Paint());

?

void drawScale(Canvas canvas, Size size) {
    final Paint circlePaint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 2.5;

    double angleRange = 180;

    double progress = 0.5;

    double rootAngle = (360 - angleRange) / 2 + 90;

    final radius = min(size.width, size.height) / 2 - circlePaint.strokeWidth / 2;

    circlePaint.color = Colors.black26;
    Offset center = Offset(size.width / 2, size.height / 2);
    for (int i = 0; i <= angleRange; i++) {
      if (i % 6 == 0) {
        Offset start = degreesToCoordinates(center, i + rootAngle, radius - 10);
        Offset end = degreesToCoordinates(center, i + rootAngle, radius);
        canvas.drawLine(start, end, circlePaint);
      }
    }
    circlePaint.color = Colors.red;

    Offset start = degreesToCoordinates(center, angleRange * progress + rootAngle, radius - 15);
    Offset handler = degreesToCoordinates(center, angleRange * progress + rootAngle, radius);
    canvas.drawLine(start, handler, circlePaint);
  }

  Offset degreesToCoordinates(Offset center, double degrees, double radius) {
    return radiansToCoordinates(center, degreeToRadians(degrees), radius);
  }

  double degreeToRadians(double degree) {
    return (pi / 180) * degree;
  }

  Offset radiansToCoordinates(Offset center, double radians, double radius) {
    var dx = center.dx + radius * cos(radians);
    var dy = center.dy + radius * sin(radians);
    return Offset(dx, dy);
  }

?

  void drawCircle(Canvas canvas, Size size) {
    final Paint circlePaint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 40
      ..strokeCap = StrokeCap.round;

    double angleRange = 300;
    List<Color> colors = [Colors.red, Colors.orange, Colors.yellow, Colors.green, Colors.cyan, Colors.blue, Colors.purple];

    double a = pi / 180;
    double rootAngle = (360 - angleRange) / 2 + 90;

    double start = a * rootAngle;
    double end = a * angleRange;

    double redress = 15;

    final radius = min(size.width, size.height) / 2 - circlePaint.strokeWidth / 2;
    final rect = Rect.fromCircle(radius: radius, center: Offset(size.width / 2, size.height / 2));

    circlePaint.shader = SweepGradient(
        transform: GradientRotation(a * (rootAngle - redress)),
        tileMode: TileMode.mirror,
        colors: colors,
        startAngle: 0,
        endAngle: end + a * redress
    ).createShader(rect);
    canvas.drawArc(rect, start, end, false, circlePaint);
  }

?

canvas.drawDRRect(RRect.fromLTRBR(0, 0, 100, 100, const Radius.circular(10)), RRect.fromLTRBR(10, 10, 90, 90, const Radius.circular(45)), Paint());

Path path = Path();
    path.moveTo(200, 0);
    path.lineTo(100, 100);
    path.lineTo(200, 100);
    path.lineTo(100, 200);
    canvas.drawPath(path, Paint()..style = PaintingStyle.stroke);

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:18:57  更:2021-12-26 22:19:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:56:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码