当前位置: 首页 > article >正文

浅尝:iOS的CoreGraphics和Flutter的Canvas

iOS的CoreGraphic

基本就是创建一个自定义的UIView,然后重写drawRect方法,在此方法里使用UIGraphicsGetCurrentContext()来绘制目标图形和样式

#import <UIKit/UIKit.h>

@interface MyGraphicView : UIView
@end

@implementation MyGraphicView

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
// This method is called when a view is first displayed or when an event occurs that invalidates a visible part of the view.
- (void)drawRect:(CGRect)rect {
    CGRect rectangle = CGRectMake(0, 0, 320, 100);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.0);
    CGContextSetRGBStrokeColor(context, 0.0, 1.0, 0.0, 0.5);
    CGContextFillRect(context, rectangle);
    CGContextStrokeRect(context, rectangle);
}

@end


Flutter的Canvas

这是main函数的主代码,在child节点实现一个自定义的画布

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      home: Scaffold(
        // Outer white container with padding 
        body: Container(
          padding: EdgeInsets.symmetric(horizontal: 40, vertical: 80),
          color: Colors.white,
          child: Container(
  				child: CustomPaint(painter: FaceOutlinePainter()),
			),
        ),
      ),
    );
  }
}

自定义一个类继承自CustomPainter,然后重写paint()方法

class FaceOutlinePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // 先定义一个画笔paint实例对象
    final paint = Paint()
      ..style = PaintingStyle.stroke
      ..strokeWidth = 4.0
      ..color = Colors.indigo;

    // 画左边的眼睛,是一个矩形的,并且有圆角20
    canvas.drawRRect(
      RRect.fromRectAndRadius(Rect.fromLTWH(20, 40, 100, 100), Radius.circular(20)),
      paint,
    );
    // 画右边的眼睛,是圆形的
    canvas.drawOval(
      Rect.fromLTWH(size.width - 120, 40, 100, 100),
      paint,
    );
    
    // 画嘴巴
    // 先初始化一个路径Path
    final mouth = Path();
    // 然后从左移动到右边
    mouth.moveTo(size.width * 0.8, size.height * 0.6);
    // 然后画椭圆曲线
    mouth.arcToPoint(
      Offset(size.width * 0.2, size.height * 0.6),
      radius: Radius.circular(150),
    );
    mouth.arcToPoint(
      Offset(size.width * 0.8, size.height * 0.6),
      radius: Radius.circular(200),
      clockwise: false,
    );

    // 把嘴巴画的线路径添加到canvas上进行绘制
    canvas.drawPath(mouth, paint);
  }

  @override
  bool shouldRepaint(FaceOutlinePainter oldDelegate) => false;
}

输出的图形大概如下所示
在这里插入图片描述


http://www.kler.cn/a/132943.html

相关文章:

  • Flink_DataStreamAPI_执行环境
  • 【网络安全】网络安全防护体系
  • 【小白可懂】微信小程序---课表渲染
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • cmake生成器表达式
  • Redis在高性能缓存中的应用
  • HarmonyOS开发Java与ArkTS如何抉择
  • 【数据预处理2】数据预处理——数据标准化
  • C# using语句使用介绍
  • 【音视频基础】AVI文件格式
  • 反转链表,剑指offer,力扣
  • 无线WiFi安全渗透与攻防(六)之WEP破解-Gerix-wifi-cracker自动化破解WEP加密
  • 组合模式 rust和java的实现
  • 【机器学习9】前馈神经网络
  • 利用 Pandoc + ChatGPT 优雅地润色论文,并保持 Word 公式格式:Pandoc将Word和LaTeX文件互相转化
  • 开源情报 (OSINT)
  • 2023年中职“网络安全“—Web 渗透测试②
  • 100张照片带你了解真实的日本人
  • 2023全新付费进群系统源码 带定位完整版 附教程
  • 功能具象化复盘
  • vite vue3 配置pinia
  • 如何理解IOC中的反射操作
  • 单元测试实战(一)Controller 的测试
  • 【力扣】从零开始的动态规划
  • 无线WiFi安全渗透与攻防(N.1)WPA渗透-pyrit:batch-table加速attack_db模块加速_“attack_db”模块加速
  • 大数据HCIE成神之路之数学(2)——线性代数