Compose Canvas

文章目录

  • 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: Offsetget() = drawContext.size.center// 当前绘图环境的大小(可以通过size获取当前Canvas的宽和高)val size: Sizeget() = drawContext.size// 绘制版面的版面方向val layoutDirection: LayoutDirectioncompanion 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.Pointstext = "PointMode.Points"}) {Text("PointMode.Points")}Button(onClick = {pointMode = PointMode.Linestext = "PointMode.Lines"}) {Text("PointMode.Lines")}Button(onClick = {pointMode = PointMode.Polygontext = "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.mzph.cn/web/1022.shtml

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

相关文章

《王者荣耀》Hello Kitty 小兵皮肤完整设置指南

王者荣耀与三丽鸥的联动活动上线了 Hello Kitty 小兵皮肤&#xff0c;让我们的峡谷小兵们也能穿上漂亮的衣服啦&#xff01;这款皮肤极具卡哇伊风格&#xff0c;引起了许多玩家的关注。许多小伙伴都想知道如何使用这款 Hello Kitty 小兵皮肤&#xff0c;今天小编将为大家整理出…

5.前后端分离

目录 一、前后端分离上传文件 1.在yml中设置port和localhost 2.如何使用postman测试上传文件的接口 二、如何导出excel文件 ​编辑1.在pom.xml中导包 2.在实体类中给每个字段添加注解&#xff0c;导出表格时&#xff0c;列名将会改为对应的中文 3.controller中方法的具体…

英语新概念2-回译法-lesson10

托尼斯蒂尔进来的时候我正在吃饭&#xff0c;托尼很多年前在一家律师事务所工作&#xff0c;但是他现在在银行工作。他有一份不错的薪资&#xff0c;但是他总是问他的朋友们借钱并且从不归还。托尼看到我然后走过来和我坐在同一张桌子。他从来没有问我借过钱。当他在吃饭的时候…

【OpenGL高级】罗德里格斯公式:绕任意轴旋转

相关主题&#xff1a; OpenGL 矩阵、四元数到矩阵、角度到轴、观察到轴 目录 一、说明二、罗德里格斯公式的推导2.1 空间点旋转问题2.2 对旋转问题的分析 三、罗德里格斯旋转公式矩阵表示&#xff1a;四、最小C代码五、结论 一、说明 解决三维坐标下的刚体旋转问题&#xff0…

【Linux】服务器时区 [ CST | UTC | GMT | RTC ]

目录 1. 硬件时间&#xff08;Real_TIME Clock [RTC time]&#xff09; 1.1 硬件时间简介 1.2 如何使用硬件时间 2. 系统时间&#xff08;UTC时间&#xff09;&#xff08;Universal time&#xff09; 2.1 系统时间简介 2.2 UTC时间 3. 本地时间&#xff08;Local time&…

深入理解大语言模型微调技术

一、概念解析 1、什么是微调&#xff08;Fine-tuning&#xff09;&#xff1f; 大模型微调&#xff0c;也称为Fine-tuning&#xff0c;是指在已经预训练好的大型语言模型基础上&#xff08;一般称为“基座模型”&#xff09;&#xff0c;使用特定的数据集进行进一步的训练&am…

DeepWalk论文精读

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

记录一个hive中因没启yarn导致的spark引擎跑insert语句的报错

【背景说明】 刚在hive中配置了Spark引擎&#xff0c;在进行Hive on Spark测试时报错&#xff0c; 报错截图如下&#xff1a; [atguiguhadoop102 conf]$ hive which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/mod…

【LAMMPS学习】八、基础知识(3.5)计算弹性常数

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【云计算】云数据中心网络(三):NAT 网关

《云网络》系列&#xff0c;共包含以下文章&#xff1a; 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP云数据中心网络&#xff08;三&#xff09;…

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

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;金字塔图案 输入&#xff1a; 4输出&#xff1a; * * * * * * * * * * 代码&#xff1a; //对于有行有列的图形采用双循环&#xff0c;i控制行…

[管理者与领导者-177] :人际网络-4-坐车的礼仪

目录 一、坐私车的基本礼仪 二、跟领导乘车&#xff0c;你坐对了吗&#xff1f;要注意什么&#xff1f; 2.1 乘车座次礼仪规则&#xff1a; 2.2 双排5座汽车礼仪的应用 2.2.1 司机驾车 2.2.2 领导驾车 2.3 三排7座商务车 一、坐私车的基本礼仪 坐私人车辆时&#xff0c…

Windows如何安装JDK

JDK和JRE简介 JDK&#xff1a;Java Development ToolKit java开发工具包&#xff0c;包含JRE针对java程序开发者 JRE&#xff1a;Java Runtime Environment java程序的运行环境针对java使用者来说 下载JDK&#xff0c;进入官网下载 Oracle官网 双击下载好之后的exe文件&#…

我为什么想成为一名程序员

#为什么你选择成为一名程序员# 目录 原因&#xff1a; 后续选择&#xff1a; 结尾&#xff1a; 原因&#xff1a; 本人是一个00后&#xff0c;出生在农村当时经济相对来说比较落后&#xff0c;村里面基本上都没几个人有手机。当时有些小伙伴他们拿着自己大人的手机在那里玩…

科普馆VR技术展现安全场景,构建安全教育新标杆!

随着VR技术的快速发展&#xff0c;其所衍生出的互动装置&#xff0c;悄无声息地渗透进了我们生活的每个角落&#xff0c;就连那严谨而重要的安全教育领域&#xff0c;也没能逃出这神奇魔法的“魔爪”&#xff0c;这种VR互动设备简直就是安全知识传递的小能手&#xff0c;那么&a…

MinIO自定义权限控制浅研

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 MinIO搭建好之后&#xff0c;出于不同场景的需要&#xff0c;有时候需要对不同的用户和Bucket做一些针对性的权限控制。 MinIO的…

PCDN与边缘计算的集成解决方案

PCDN与边缘计算的集成解决方案 在数字化时代&#xff0c;内容的快速、安全地传递至用户变得至关重要。无论是媒体、教育还是其他领域&#xff0c;所有这些行业都需要强大的技术支持以保证信息的实时更新和安全传输。PCDN&#xff08;Peer Content Delivery Network&#xff0c…

实在RPA设计器试用导引

一、产品概述 实在RPA设计器是一款将人工智能(AI)与机器人流程自动化(RPA)深度融合的可视化自动流程编辑器。它通过AI推荐与桌面嵌入式交互&#xff0c;极大简化了RPA的使用难度&#xff0c;让普通业务人员也能轻松使用。实在RPA设计器具备以下核心优势&#xff1a; 兼容性&a…

如何在Windows 10锁定时启用内置管理员?这里提供详细步骤

序言 当被锁定在Windows 10计算机之外时,如何启用内置管理员?正如我们所知,一旦启用了内置管理员,我们所有人都可以将其用作另一个本地管理员帐户来登录锁定的计算机。 当然,即使当你被锁定在Windows 10计算机之外时,你也可以启用内置管理员。你需要的只是Windows 10系…

TVBox的Json配置接口编写指南,模板格式说明(如何打造一个专属于自己的TVBox配置文件)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 配置解析 📒📝 JSON基础📝 配置文件结构/参数说明📝 编写步骤📝 注意事项🎈 接口分享⚓️ 相关链接 ⚓️📖 介绍 📖 TVBox 是一款备受欢迎的电视盒子应用(免费影视必备),它以其高度自定义的特性深受用户喜爱…