Compose Canvas

news2025/1/19 8:16:26

文章目录

  • Compose Canvas
    • 概述
    • Canvas属性
    • drawPoints 绘制点
      • drawPoints属性
      • 使用
    • drawLine 绘制线
      • drawLine属性
      • 使用
    • drawRect 绘制矩形
      • drawRect属性
      • 使用
    • drawRoundRect 绘制圆角矩形
      • drawRoundRect属性
      • 使用
    • drawCircle 绘制圆
      • drawCircle属性
      • 使用
    • drawOval 绘制椭圆
      • drawOval属性
      • 使用
    • drawArc 绘制圆弧
      • drawArc属性
      • 使用
    • drawImage 绘制图片
      • drawImage属性
      • 使用
    • drawPath 绘制路径
      • drawPath属性
      • 使用
    • 混合模式

Compose Canvas

概述

在Compose中绘制文字、曲线、矩形、圆、椭圆、圆弧、路径、BlendMode等。

Canvas属性

@Composable
fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) =  
    Spacer(modifier.drawBehind(onDraw))
@DrawScopeMarker
interface DrawScope : Density {

    // 当前的DrawContext,包含创建绘图环境所需的依赖项
    val drawContext: DrawContext

    // 绘图环境当前边界的中心
    val center: Offset
        get() = drawContext.size.center

    // 当前绘图环境的大小(可以通过size获取当前Canvas的宽和高)
    val size: Size
        get() = drawContext.size

    // 绘制版面的版面方向
    val layoutDirection: LayoutDirection

    companion object {

        // 用于每个绘图操作的默认混合模式。这样可以确保将内容绘制在目标中的像素上方
        val DefaultBlendMode: BlendMode = BlendMode.SrcOver
    }
}

drawPoints 绘制点

drawPoints属性

// 方法一:
fun drawPoints(
    points: List<Offset>, // 点的集合
    // Points:点模式;Lines:两点的线模式;Polygon:连续的线模式
    pointMode: PointMode, // 绘制方式
    color: Color, // 颜色
    strokeWidth: Float = Stroke.HairlineWidth, // 宽度
    // Butt:直角,末端无延伸;Round:圆角,末端有延伸;Square:直角,末端有延伸
    cap: StrokeCap = StrokeCap.Butt, // 末端处理
    pathEffect: PathEffect? = null, // 点的可选效果或图案
    alpha: Float = 1.0f, // 透明度
    colorFilter: ColorFilter? = null,  // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

// 方法二:
fun drawPoints(
    points: List<Offset>,
    pointMode: PointMode,
    brush: Brush, // 渐变色
    strokeWidth: Float = Stroke.HairlineWidth,
    cap: StrokeCap = StrokeCap.Butt,
    pathEffect: PathEffect? = null,
    alpha: Float = 1.0f,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)

使用

使用pointMode属性:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

var pointMode by remember {
    mutableStateOf(PointMode.Points)
}
val scrollState = rememberScrollState()
val points = arrayListOf(
    Offset(100F, 100F),
    Offset(300F, 300F),
    Offset(500F, 500F),
    Offset(700F, 500F),
    Offset(900F, 900F),
)
var text by remember {
    mutableStateOf("PointMode.Points")
}
Column(modifier = Modifier.fillMaxSize()) {
    Row(modifier = Modifier.horizontalScroll(scrollState)) {
        Button(onClick = {
            pointMode = PointMode.Points
            text = "PointMode.Points"
        }) {
            Text("PointMode.Points")
        }
        Button(onClick = {
            pointMode = PointMode.Lines
            text = "PointMode.Lines"
        }) {
            Text("PointMode.Lines")
        }
        Button(onClick = {
            pointMode = PointMode.Polygon
            text = "PointMode.Polygon"
        }) {
            Text("PointMode.Polygon")
        }
    }
    Text(text)
    Canvas(modifier = Modifier
           .size(360.dp)
           .background(Color.LightGray)) {
        drawPoints(
            points = points,
            pointMode = pointMode,
            color = Color.Red,
            strokeWidth = 15F
        )
    }
}

使用brush属性:

在这里插入图片描述

Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawPoints(
        points = points,
        pointMode = PointMode.Polygon,
        cap = StrokeCap.Square,
        strokeWidth = 30F,
        brush = Brush.linearGradient(
            colors = arrayListOf(Color.Red, Color.Green, Color.Blue)
        )
    )
}

上面的颜色是均匀分布的,也可以精确指定每段的颜色,如下:

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawPoints(
        points = points,
        pointMode = PointMode.Polygon,
        cap = StrokeCap.Square,
        strokeWidth = 30F,
        brush = Brush.linearGradient(
            0.0F to Color.Red, 0.2F to Color.Green, 0.8F to Color.Blue
        )
    )
}

drawLine 绘制线

drawLine属性

// 方法一:
fun drawLine(
    color: Color, // 线的颜色
    start: Offset, // 开始坐标
    end: Offset, // 结束坐标
    strokeWidth: Float = Stroke.HairlineWidth, // 线的宽度
    cap: StrokeCap = Stroke.DefaultCap, // 末端处理
    pathEffect: PathEffect? = null, // 线的可选效果或图案
    alpha: Float = 1.0f, // 透明度
    colorFilter: ColorFilter? = null, // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

// 方法二:
fun drawLine(
    brush: Brush, // 渐变色
    start: Offset,
    end: Offset,
    strokeWidth: Float = Stroke.HairlineWidth,
    cap: StrokeCap = Stroke.DefaultCap,
    pathEffect: PathEffect? = null,
    alpha: Float = 1.0f,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawLine(
        color = Color.Red,
        start = Offset(100F, 100F),
        end = Offset(900F, 900F),
        strokeWidth = 30F,
        cap = StrokeCap.Round
    )
}

drawRect 绘制矩形

drawRect属性

fun drawRect(
    color: Color, // 颜色
    topLeft: Offset = Offset.Zero, // 顶点
    size: Size = this.size.offsetSize(topLeft), // 尺寸
    alpha: Float = 1.0f, // 透明度
    // Fill:填充;Stroke:边框;
    style: DrawStyle = Fill, // 样式
    colorFilter: ColorFilter? = null, // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

class Stroke(
    val width: Float = 0.0f, // 边的宽度
    val miter: Float = DefaultMiter, // 连接角度
    val cap: StrokeCap = StrokeCap.Butt, // 末端处理
    val join: StrokeJoin = StrokeJoin.Miter, // 边的连接处理
    val pathEffect: PathEffect? = null
) : DrawStyle()

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawRect(
        color = Color.Red,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 400F)
    )
}

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawRect(
        color = Color.Red,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 400F),
        style = Stroke(width = 30F, cap = StrokeCap.Round)
    )
}

drawRoundRect 绘制圆角矩形

drawRoundRect属性

fun drawRoundRect(
    color: Color,
    topLeft: Offset = Offset.Zero,
    size: Size = this.size.offsetSize(topLeft),
    cornerRadius: CornerRadius = CornerRadius.Zero, // 圆角
    style: DrawStyle = Fill,
    alpha: Float = 1.0f,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawRoundRect(
        color = Color.Red,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 600F),
        cornerRadius = CornerRadius(50F),
        style = Stroke(width = 30F)
    )
}

drawCircle 绘制圆

drawCircle属性

fun drawCircle(
    color: Color, // 颜色
    radius: Float = size.minDimension / 2.0f, // 半径
    center: Offset = this.center, // 圆形坐标
    alpha: Float = 1.0f, // 透明度
    style: DrawStyle = Fill, // 样式
    colorFilter: ColorFilter? = null, // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawCircle(
        color = Color.Red,
        radius = 300F,
        center = center
    )
}

在这里插入图片描述

Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawCircle(
        color = Color.Red,
        radius = 300F,
        center = center,
        style = Stroke(width = 30F)
    )
}

drawOval 绘制椭圆

drawOval属性

fun drawOval(
    color: Color,
    topLeft: Offset = Offset.Zero,
    size: Size = this.size.offsetSize(topLeft),
    alpha: Float = 1.0f,
    style: DrawStyle = Fill,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawOval(
        color = Color.Red,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 600F),
        style = Stroke(width = 30F)
    )
}

drawArc 绘制圆弧

drawArc属性

fun drawArc(
    color: Color, // 颜色
    startAngle: Float, // 开始角度
    sweepAngle: Float, // 弧度
    useCenter: Boolean, // 是否使用中心
    topLeft: Offset = Offset.Zero, // 顶点
    size: Size = this.size.offsetSize(topLeft), // 尺寸
    alpha: Float = 1.0f, // 透明度
    style: DrawStyle = Fill, // 样式
    colorFilter: ColorFilter? = null, // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

使用

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawArc(
        color = Color.Red,
        startAngle = 0F,
        sweepAngle = 270F,
        useCenter = true,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 400F)
    )
}

在这里插入图片描述

Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawArc(
        color = Color.Red,
        startAngle = 0F,
        sweepAngle = 270F,
        useCenter = false,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 400F)
    )
}

在这里插入图片描述

Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawArc(
        color = Color.Red,
        startAngle = 0F,
        sweepAngle = 270F,
        useCenter = false,
        topLeft = Offset(100F, 100F),
        size = Size(400F, 400F),
        style = Stroke(width = 5F)
    )
}

drawImage 绘制图片

drawImage属性

// 方式一:
fun drawImage(
    image: ImageBitmap, // 图片
    topLeft: Offset = Offset.Zero, // 顶点
    alpha: Float = 1.0f, // 透明度
    style: DrawStyle = Fill, // 样式
    colorFilter: ColorFilter? = null, // 颜色效果
    blendMode: BlendMode = DefaultBlendMode // 混合模式
)

// 方式二:
fun drawImage(
    image: ImageBitmap,
    srcOffset: IntOffset = IntOffset.Zero, // 设置原图片
    srcSize: IntSize = IntSize(image.width, image.height), // 设置原图片尺寸
    dstOffset: IntOffset = IntOffset.Zero, // 设置目标图片
    dstSize: IntSize = srcSize, // 设置目标图片尺寸
    alpha: Float = 1.0f,
    style: DrawStyle = Fill,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode,
    filterQuality: FilterQuality = DefaultFilterQuality
)

使用

在这里插入图片描述

val context = LocalContext.current
val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.a)
val image = bitmap.asImageBitmap()
Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawImage(
        image = image
    )
}

在这里插入图片描述

val context = LocalContext.current
val bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.a)
val image = bitmap.asImageBitmap()
Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawImage(
        image = image,
        srcOffset = IntOffset(0, 0),
        srcSize = IntSize(100, 100),
        dstOffset = IntOffset(100, 100),
        dstSize = IntSize(400, 400)
    )
}

drawPath 绘制路径

drawPath属性

fun drawPath(
    path: Path,
    color: Color,
    alpha: Float = 1.0f,
    style: DrawStyle = Fill,
    colorFilter: ColorFilter? = null,
    blendMode: BlendMode = DefaultBlendMode
)

使用

在这里插入图片描述

val path = Path()
path.moveTo(100F, 300F)
path.lineTo(100F, 700F)
path.lineTo(800F, 700F)
path.lineTo(900F, 300F)
path.lineTo(600F, 100F)
path.close()
Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawPath(
        path = path,
        color = Color.Red,
        style = Stroke(width = 10F)
    )
}

在这里插入图片描述

val path = Path()
path.moveTo(100F, 300F)
path.lineTo(100F, 700F)
path.quadraticBezierTo(800F,700F,600F,100F)
path.cubicTo(700F,200F,800F,400F,100F,100F)
path.close()
Canvas(
    modifier = Modifier
        .size(360.dp)
        .background(Color.LightGray)
) {
    drawPath(
        path = path,
        color = Color.Red,
        style = Stroke(width = 10F)
    )
}

混合模式

混合模式:

在这里插入图片描述

BlendMode类型说明:

在这里插入图片描述

使用:

在这里插入图片描述

Canvas(
    modifier = Modifier
    .size(360.dp)
    .background(Color.LightGray)
) {
    drawCircle(
        color = Color.Yellow,
        radius = 170F,
        center = Offset(350F, 350F),
        blendMode = BlendMode.Clear
    )
    drawRect(
        color = Color.Red,
        topLeft = Offset(300F, 300F),
        size = Size(350F, 350F),
        blendMode = BlendMode.Clear
    )
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1608217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【宝德PI300T G2智能小站开发教程(三)】centos配置系统开发源

目录 一.前言 二.配置dns服务器 三.测试连通性 四.设置更新源文件 一.前言 openeular系统的宝德板子没有更新的国内源,要如何配置? 二.配置dns服务器 vi /etc/resolv.conf 添加如下内容: nameserver 8.8.8.8 nameserver 114.114.114.114 三.测试连通性 ping www.ba…

Python教学入门:流程控制

条件语句&#xff08;if 语句&#xff09;&#xff1a; 条件语句用于根据条件的真假执行不同的代码块。 x 10if x > 0: # 如果 x 大于 0print("x 是正数") # 输出&#xff1a;x 是正数 elif x 0: # 如果 x 等于 0print("x 是零") else: # 如果以…

【C语言】每日一题,快速提升(7)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;X图形 示例&#xff1a; 输入&#xff1a; 5 //几行数输出&#xff1a; …

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。 文章目录 一、加载地形点云数据二、创建三维地形模型1. 泊松方法2. 贪婪三角形测量方法3. 阿尔法形状注意事项一、加载地形点云数据 加载配套案例数据包中的data074.rar中的地形点云数据…

【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)

前言 本篇博客我们来实现一个小游戏项目——贪吃蛇&#xff0c;相信肯定很多人都玩过&#xff0c;那么整个贪吃蛇是怎么实现出来的那&#xff0c;这个项目用到了很多方面的知识&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这…

《QT实用小工具·三十二》九宫格炫酷主界面

1、概述 源码放在文章末尾 项目实现了九宫格炫酷主界面&#xff0c;下面是项目demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h"frmMain::frmMain…

DeepWalk论文精读

介绍 图神经网络的开山之作 DeepWalk&#xff1a;一种用于学习网络中顶点的潜在表示的新方法&#xff0c;使用随机行走中获得的局部信息&#xff0c;通过将序列视为句子&#xff0c;节点视为单词 通过随机游走可以采样出一个序列&#xff0c;序列好比一句话&#xff0c;节点…

postgresql数据库pg_dirtyread插件闪回技术 —— 筑梦之路

闪回查询&#xff08;Flashback Query&#xff09;是一种在数据库中执行时间点查询的技术。它允许查询数据库中过去某个时间点的数据状态&#xff0c;并返回相应的查询结果。通常闪回查询分为表级以及行级的闪回查询。PostgreSQL数据库由于MVCC的机制&#xff0c;对于DML的操作…

初学python记录:力扣1883. 准时抵达会议现场的最小跳过休息次数

题目&#xff1a; 给你一个整数 hoursBefore &#xff0c;表示你要前往会议所剩下的可用小时数。要想成功抵达会议现场&#xff0c;你必须途经 n 条道路。道路的长度用一个长度为 n 的整数数组 dist 表示&#xff0c;其中 dist[i] 表示第 i 条道路的长度&#xff08;单位&…

怎么配置python

右键点击“计算机”&#xff0c;选择“属性”。 在左侧栏找到“高级系统设置”。 点击“环境变量”。 在系统变量中&#xff0c;双击“Path”。 在字符串的末尾&#xff0c;加一个分号; 然后再输入你安装python的路径&#xff0c;如图所示&#xff1a; 点击“确定”&#xff0…

使用Docker搭建一主二从的redis集群

文章目录 一、根据基础镜像构建三个docker容器二、构建master机三、配置slave机四、测试 本文使用 主机指代 物理机、 master机指代“一主二从”中的 一主&#xff0c; slave机指代“一主二从”中的 二从 一、根据基础镜像构建三个docker容器 根据本文第一章&#xff08…

有哪些公认好用且免费的云渲染网渲平台?渲染100邀请码1a12

现在云渲染是越来越火了&#xff0c;无论是在建筑设计、影视动画还是效果图行业都有它的身影&#xff0c;云渲染能缩短制作周期&#xff0c;提高工作效率&#xff0c;那么市面上有哪些公认好用且免费的云渲染平台呢&#xff1f;这次我们来了解下。 首先&#xff0c;我们来看看有…

使用名称空间共享集群

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

Stm32-hal库串口教程

工程是在上一节的LED的基础上修改的。 串口原理图 串口配置 led参考 CubelMX点灯-CSDN博客https://blog.csdn.net/anlog/article/details/137830323生成工程 编写包含文件 编写重定向代码 编写发送 编译下载 串口没有收到数据 查找原因 少配置了下图 再编译下载 收到数据…

ELK+Kafka+Zookeeper日志收集系统

环境准备 节点IP节点规划主机名192.168.112.3Elasticsearch Kibana Logstash Zookeeper Kafka Nginxelk-node1192.168.112.3Elasticsearch Logstash Zookeeper Kafkaelk-node2192.168.112.3Elasticsearch Logstash Zookeeper Kafka Nginxelk-node3 基础环境 sys…

九章云极DataCanvas AIDC OS智算操作系统正式发布,开启AI智算新纪元

4月18日&#xff0c;2024九章云极DataCanvas智算操作系统新品发布会于北京隆重召开&#xff0c;全新产品DATACANVAS AIDC OS智算操作系统&#xff08;以下简称AIDC OS&#xff09;正式官宣。AIDC OS以卓越的AI技术实力和AI基础软件为根基&#xff0c;以重新定义和突破传统为创新…

flutter书架形式格口的动态创建(行、列数,是否全选的配置)

根据传入的行列数创建不同格口数量的书架 左图&#xff1a;5行3列、右图&#xff1a;3行3列 代码 import package:jade/bean/experienceStation/ExpCellSpecsBean.dart; import package:jade/configs/PathConfig.dart; import package:jade/utils/DialogUtils.dart; import p…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

PS CC 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到PS 2024安装包”。 打开解压后的文件夹&#xff0c;鼠标右击“Set-up”选择“以管理员身份运行”。 点击“文件夹”图标&#xff0c;选择安装的位置。 点击“更改位置”。 选择“D”盘&#xff0c;点击“新建文件夹”命名&#xff0…