Compose Canvas基础

news2025/1/12 23:36:36

Compose Canvas基础

  • 前言
  • Canvas是什么
  • drawxxx()绘制方法
    • drawCircle 画圆
      • 不填充颜色
      • 设置线条的宽度
    • drawRect 画矩形
    • drawPoints 画点
      • pointMode
    • drawOval 画椭圆
    • drawLine 画线
    • drawRoundRect 画圆角矩形
    • drawArc 绘制弧形或扇形
      • useCenter
    • drawPath 画自定义图形
  • 总结

前言

阅读本文需要一定compose基础,如果没有请移步Jetpack Compose入门详解(实时更新)

本文介绍Compose Canvas基础,介绍Canvas可组合项依赖的原理和绘制相关的内置api。

本文的写作顺序和风格参造HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础

Canvas是什么

Canvas可组合项允许我们在屏幕上指定区域并在此区域上执行画布绘制。必须使用修饰符指定大小,无论是通过modifier.size修饰符指定精确大小,还是通过modifier.fillMaxSize、ColumnScope.weight等指定相对于父项的大小。如果父项包装此子项,则必须仅指定精确大小。
参数:

  • modifier-指定此可组合文件的大小策略的强制修饰符
  • onDraw-将被调用以执行绘图的lambda。请注意,这个lambda将在绘制阶段被调用,您不能访问组合范围,这意味着它内部的可组合函数调用将导致运行时异常
@Composable
fun Canvas(modifier: Modifier, onDraw: DrawScope.() -> Unit) =
    Spacer(modifier.drawBehind(onDraw))

可以看到所有的Canvas可组合项都用Spacer创建了一个空白的可组合项,然后调用了Modifier.drawBehind方法。而drawBehind的作用是将onDraw中的内容绘制到修改内容后面的画布中。

drawxxx()绘制方法

以draw开头的api是Canvas绘图的一种方式
在这里插入图片描述
从后面衔接的单词可以看出具体我们能画个什么东西出来,下面我们举个简单例子。

drawCircle 画圆

例子如下:

    Canvas(modifier = Modifier, onDraw = {

		drawCircle(
            color = Color(0xFFF44336),
            radius = size.width / 4,
            center = center
        )

    } )

注意,上例中的size和center表示Canvas 的尺寸和中心

效果
在这里插入图片描述

参数解释:

  • color -画圆填充的颜色
  • radius- 圆的半径
  • center 圆的圆心
  • alpha-应用于圆形的不透明度,从0.0f到1.0f,分别表示完全透明到完全不透明
  • style-是否描边或填充圆
  • colorFilter-绘制到目标时应用于颜色的colorFilter
  • blendMode-要应用于笔刷的混合算法

不填充颜色

那么我们只想画一个没有填充颜色,只有描边颜色的圆要怎么做呢?添加style就够了

        drawCircle(
            color = Color(0xFFF44336),
            radius = size.width / 4,
            center = center,
            style = Stroke()
        )

效果:
在这里插入图片描述

设置线条的宽度

改变上例代码:

        drawCircle(
            color = Color(0xFFF44336),
            radius = size.width / 4,
            center = center,
            style = Stroke(20f)
        )

效果:
在这里插入图片描述

drawRect 画矩形

其实也是差不多的,示例代码如下:

 		drawRect(
            color = Color(0xFFF44336),
            size = Size(size.width/4,size.height/4),
        )

        drawRect(
            color = Color(0xFFF44336),
            size = Size(size.width/4,size.height/4),
            style = Stroke(20f),
            topLeft = Offset(300F, 0F)
        )

效果如下:
在这里插入图片描述

参数解释:

  • topLeft 往左边偏移的坐标

drawPoints 画点

示例代码如下:

        val list: MutableList<Offset> = mutableListOf()
        val offset = Offset(100f, 100f)
        val offset1 = Offset(200f, 200f)
        val offset3= Offset(100f, 300f)
        list.add(offset)
        list.add(offset1)
        list.add(offset3)
        drawPoints(
            points = list,
            pointMode = PointMode.Points,
            color = Color.Black,
            strokeWidth = 20f,
            cap = StrokeCap.Round
            )

效果如下:
在这里插入图片描述
参数解析:

  • points-使用指定PointMode绘制的点列表
  • pointMode-用于指示如何绘制点的pointMode
  • color-应用于点的颜色
  • alpha-应用于0.0f到1.0f路径的不透明度,分别表示完全透明到完全不透明
  • strokeWidth-要应用于线条的笔划宽度
  • cap-应用于线段末端的处理
  • pathEffect-应用于点的可选效果或模式
  • colorFilter-绘制到目标时应用于颜色的colorFilter
  • blendMode-绘制路径时应用于路径的混合算法

pointMode

我们重点说下pointMode

  1. PointMode.Points 也就是上例代码使用的,会 分别绘制每个点。
    如果Paint.strokeCap为strokeCap.Round,则每个点都绘制为直径为Paint.stronkeWidth的圆,并按照Paint(忽略Paint.style)的说明填充。
    否则,每个点都将绘制为一个轴对齐的正方形,边长为Paint.strokeWidth,按“绘制”(忽略“绘制.样式”)所述填充

  2. PointMode.Lines 将两个点的每个序列绘制为线段。如果点数为奇数,则忽略最后一个点。线条按“绘制”(Paint)所述进行笔划处理(忽略“绘制.样式”)。
    将pointMode更改为Lines的效果
    将pointMode更改为Lines的效果

  3. PointMode.Polygon 将整个点序列绘制为一条线。线条按“绘制”(Paint)所述进行笔划处理(忽略“绘制.样式”)。
    在这里插入图片描述
    将pointMode更改为Polygon的效果

drawOval 画椭圆

示例代码:

        drawOval(
            color = Color(0xFFF44336),
            size = Size(size.width/4,size.height/4),
        )

和画矩形的参数是一模一样的

drawLine 画线

示例代码:

        drawLine(
            color = Color.Green,
            start = Offset(100f,100f),
            end = Offset(100f,200f),
            strokeWidth = 20f
        )

效果:
在这里插入图片描述
如果你仔细观察可以发现drawPoints的PointMode.Lines模式可以实现drawLine一样的效果,这是没有差别的,全看个人喜好。

drawRoundRect 画圆角矩形

示例代码:

        drawRoundRect(
            color = Color(0xFFF44336),
            size = Size(size.width/4,size.height/4),
            style = Stroke(20f),
            topLeft = Offset(300F, 0F),
            cornerRadius = CornerRadius(50f)
        )

效果:

在这里插入图片描述
参数解析:

  • cornerRadius 圆角的度数,如果不传和传负数则为0,就变成画矩形了

drawArc 绘制弧形或扇形

示例代码:

        drawArc(
            color = Color(0xFFF44336),
            size = Size(size.width/2,size.height/4),
            startAngle = 0f,
            sweepAngle = 90f,
            useCenter = true
        )

效果:
在这里插入图片描述
参数解析:

  • startAngle 以度为单位的起始角度。0表示3点钟
  • sweepAngle-相对于startAngle顺时针绘制的圆弧的大小(以度为单位)
  • useCenter-指示圆弧是否要闭合边界中心的标志

useCenter

将useCenter = false

        drawArc(
            color = Color(0xFFF44336),
            size = Size(size.width/2,size.height/4),
            startAngle = 0f,
            sweepAngle = 90f,
            useCenter = false
        )

效果如下:
在这里插入图片描述

drawPath 画自定义图形

示例代码:

 val path = Path()
        path.moveTo(100f, 100f);
        path.lineTo(200f,200f)
        path.lineTo(100f,200f)
        drawPath(path,color = Color(0xFFF44336) )

效果:
在这里插入图片描述
参数解析:

  • Path 要绘制的图形的路径,如果要将两端未连接的线段连接成图形可以使用 path.close()

Path 可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。把这些图形结合起来,就可以描述出很多复杂的图形。下面我就说一下具体的怎么把这些图形描述出来。

Path 有两类方法,一类是直接描述路径的,另一类是辅助的设置或计算。

总结

本文介绍了Compose Canvas基础,包括Canvas可组合项的使用方法,以及绘制各种形状的api方法。通过本文的介绍,我们可以了解到Canvas绘制的基本原理和常用的api方法,可以为我们后续的Compose开发中提供参考。同时也要注意到不同参数的调整会对绘制结果产生不同的影响。

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

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

相关文章

【C++ 学习 ㉕】- 万字详解 unordered_map 和 unordered_set(哈希表的查找和容器的模拟实现)

目录 一、unordered_map 的基本介绍 二、unordered_set 的基本介绍 三、相关练习 3.1 - 在长度 2N 的数组中找出重复 N 次的元素 3.2 - 存在重复元素 3.3 - 两句话中的不常见单词 四、哈希表的查找 4.1 - 哈希表的基本概念 4.2 - 哈希函数的构造方法 4.3 - 处理冲突的…

用go获取IPv4地址,WLAN的IPv4地址,本机公网IP地址详解

文章目录 获取IPv4地址获取WLAN的IPv4地址获取本机公网IP地址 获取IPv4地址 下面的代码会打印出本机所有的IPv4地址。这个方法可能会返回多个IP地址&#xff0c;因为一台机器可能有多个网络接口&#xff0c;每个接口可能有一个或多个IP地址。 package mainimport ("fmt&…

阿里云服务器地域和可用区查询表_地域可用区大全

阿里云服务器地域和可用区有哪些&#xff1f;阿里云服务器地域节点遍布全球29个地域、88个可用区&#xff0c;包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域&#xff0c;同一个地域下有多个可用区可以选择&#xff0c;阿里云服务器网分享2023新版…

批量剪辑技巧:视频去色处理,让色彩焕然一新!

你是否曾经遇到过这样的问题&#xff1a;大量视频需要处理&#xff0c;但色彩总是达不到你的要求&#xff1f;现在&#xff0c;我们将向你展示如何通过批量剪辑技巧&#xff0c;轻松去除视频原色&#xff0c;让色彩焕然一新&#xff01; 首先&#xff0c;我们要进入【视频剪辑…

##***

本文涵盖了一种名为"快速编写论文&#xff0c;课设辅助器"的智能人工智能&#xff08;AI&#xff09;系统。该系统旨在提供高效的论文和课程设计撰写辅助功能。通过利用先进的自然语言处理和机器学习算法&#xff0c;该系统能够自动生成与特定主题相关的内容&#xf…

苹果mac电脑securecrt下载 附securecrt破解文件

SecureCRT for Mac是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;专为Mac OS X系统设计&#xff0c;用于提供安全SSH、Telnet和其他协议的远程访问和管理。它适用于各种操作系统和设备&#xff0c;如Windows、Linux和UNIX等&#xff0c;为Mac用户提供了广泛的连接…

嵌入式学习笔记(46) NandFlash的结构

9.2.1 Nand的单元组织&#xff1a;block与page&#xff08;大页Nand与小页Nand&#xff09; (1)Nand的页和以前讲过的块设备&#xff08;尤其是硬盘&#xff09;的扇区是类似的。扇区最早在磁盘中是512字节&#xff0c;后来也有些高级硬盘扇区不是512字节&#xff0c;而是1024…

高中生自学Python,这里给大家一些建议

高一学业压力比较重&#xff0c;如果你还是选择自学Python&#xff0c;每天可以抽出一两个小时来学习的话&#xff0c;也是可以的。下面是我给你的5点建议&#xff1a; 找浅显易懂&#xff0c;例子比较好的教程&#xff0c;从头到尾看下去。不要看很多本&#xff0c;专注于一本…

C/C++:[Error] ld returned 1 exit status 解决方案

好久没用了&#xff0c;今天写了会儿代码&#xff0c;各种BUg,emmmmmm 出现了很多次以下这个问题&#xff1a;[Error] ld returned 1 exit status 可能问题&解决方式&#xff1a; 常见的语法/单词拼写错误&#xff1a;常见的Main,printf,scanf等拼写错误 函数名或者声明有…

行与走,放慢自己,思考回顾。

为什么要出去行与走&#xff1f; 1、出去行与走看到祖国的大美风景&#xff0c;可以更深刻的认识到我们祖国的美好。 2、可以放空心情&#xff0c;排除掉积攒在写字楼内的方格子里面的郁闷和烦恼。 3、可以为自己的身体和心灵找一个安静和清澈净土。 4、在行和走之间&#…

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章&#xff1a; 总述&#xff1a;https://blog.csdn.net/www_dong/article/details/132515446 注册与注销&#xff1a;https://blog.csdn.net/www_dong/article/details/132654525 心跳保活&#xff1a;https://blog.csdn.net/www_dong/article/details/132796…

SpringCloud-Bus

接上文 SpringCloud-消息组件 1 注册Bus Bus需要基于一个具体的消息队列实现&#xff0c;比如RabbitMQ.还使用最开始的服务拆分项目&#xff0c;比如现在借阅服务的某个接口调用时&#xff0c;能给用户服务和图书服务发送一个通知。 首先父项目导入SpringCloud依赖 <depend…

MySQL数据库单表查询

素材: 表名: worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NOT NULL DEFAULT 群…

力扣 -- 1027. 最长等差数列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestArithSeqLength(vector<int>& nums) {int nnums.size();int ret2;unordered_map<int,int> hash;//这里可以先把nums[0]存进哈希表中&#xff0c;方便后面i从1开始遍历hash[num…

Python的函数

近期遇到了一个没怎么看懂的Python函数的形式。 def twoSum(self, nums: List[int], target: int) -> List[int]: 后来上网查了资料。

剑指offer——JZ35 复杂链表的复制 解题思路与具体代码【C++】

一、题目描述与要求 复杂链表的复制_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请对此链…

如何修改springboot项目启动时的默认图标?

如下所示为springboot项目启动时的默认图标&#xff0c;我们可以把它换成我们自己喜欢的图片 方法如下&#xff1a; 第一步&#xff1a;我们需要将图片放置当前项目的resources目录下 如下所示为我自定义的一张照片 第二步&#xff1a; 方法1:在application.properties文件中…

【数据结构】论如何拿捏快速排序?(含非递归)

目录 一&#xff0c;快速排序&#xff08;递归&#xff09; 1&#xff0c;快排思想 2&#xff0c;霍尔排序 3&#xff0c;挖坑法 4&#xff0c;前后指针法 5&#xff0c;快速排序优化 1&#xff0c;三数取中法选key 2&#xff0c;小区间优化 二&#xff0c;快速排序&a…

超大视频如何优雅切片

背景 有一次录屏产生了一个大小为33G的文件, 我想把他上传到B站, 但是B站最大只支持4G. 无法上传, 因此做了一个简单的探索. 质疑与思考 a. 有没有一个工具或一个程序协助我做分片呢? 尝试 a. 必剪 > 有大小限制, 添加素材加不进去(而且报错信息也提示的不对) b. PR &…

深入剖析红黑树:优雅地平衡二叉搜索树

目录 一.红黑树的概念二.插入操作三.与AVL树的比较 一.红黑树的概念 在之前的学习中&#xff0c;我们了解了二叉搜索平衡树&#xff0c;AVL树通过控制每个结点中的平衡因子的绝对值不超过1&#xff0c;实现了一个高性能的树。而相较于AVL的高度平衡&#xff0c;红黑树觉得AVL为…