Compose Canvas基础(2) 图形转换

news2025/1/24 5:47:24

Compose Canvas基础(2)图形转换

  • 前言
  • 平移 translate
  • 缩放 scale
  • 旋转 rotate
  • 自定义绘图区域及绘制内边距inset
  • 组合转换 withTransform
  • 完整代码
  • 总结

上一篇文章 Compose Canvas基础(1) drawxxx方法

前言

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

本文介绍Compose Canvas基础,介绍Canvas可组合项绘制的图形的转换相关api。


平移 translate

下例的代码都在Canvas可组合项的drawscope中

代码示例如下:

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

        translate(left = 100f,top = 100f){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = false
            )
        }

效果如下:
在这里插入图片描述
需要讲解的是translate()方法,它有三个参数

  • left-在x轴上平移坐标空间的像素
  • top-在y轴上平移坐标空间的像素
  • block-lambda,用于将图形包裹起来的lambda

上例代码表示将图形向右移动100像素,向下移动100像素.


缩放 scale

代码示例如下:

 		translate(left = 100f,top = 100f){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = false
            )
        }

        scale(scaleX = 2f,scaleY = 1f){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = false
            )
        }

效果如下:
在这里插入图片描述
需要讲解的是scale()方法,它有四个参数

  • scaleX-要在X中缩放的量
  • scaleY-要在Y中缩放的量
  • pivot-轴心点的坐标,默认为坐标空间的中心
  • block-lambda,用于将图形包裹起来的lambda

上例代码表示将图形以中心为轴心以x缩放2倍,y不变.


旋转 rotate

代码示例如下:

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

效果如下:
在这里插入图片描述
需要讲解的是rotate()方法,它有四个参数

  • degrees-顺时针旋转
  • pivot-轴心点的坐标,默认为坐标空间的中心
  • block-lambda,用于将图形包裹起来的lambda

上例代码表示将图形以中心为轴心顺时针旋转45度.


自定义绘图区域及绘制内边距inset

代码示例如下:

 drawArc(
                color = Color(0xFFF44336),
                size = size,
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )

        val cqs = size/2f
        inset(horizontal = 50f, vertical = 30f){
            drawArc(
                color = Color(0xFFF44336),
                size = cqs,
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )
        }

效果如下:
在这里插入图片描述
需要讲解的是inset()方法,它有四个参数

  • horizontal-插入左右边界的像素数。默认为零
  • vertical-插入上边界和下边界的可选像素数。默认为零
  • block-lambda,用于将图形包裹起来的lambda

上例代码表示将图形以canvas的宽高度的一半为区域作图,并且horizontalpadding 50像素 verticapadding 30像素.


组合转换 withTransform

代码示例如下:

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

        withTransform({
                translate(left= 600f)
                scale(scaleX = 2f,scaleY = 1f)
            }){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )
        }

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

需要讲解的是withTransform()方法,它有四个参数

  • transformBlock-调用回调以在发布绘图操作之前发布要进行的转换
  • block-lambda,用于将图形包裹起来的lambda

上例代码表示将图形先以平移600像素,再缩放2倍.

完整代码


import androidx.compose.foundation.Canvas
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.PointMode
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.graphics.drawscope.inset
import androidx.compose.ui.graphics.drawscope.rotate
import androidx.compose.ui.graphics.drawscope.scale
import androidx.compose.ui.graphics.drawscope.translate
import androidx.compose.ui.graphics.drawscope.withTransform
import androidx.compose.ui.text.drawText
import androidx.compose.ui.tooling.preview.Preview


/**
 * @author zengyifeng
 * @date createDate:2023-10-03
 * @brief description
 */
@Preview(showBackground = true, showSystemUi = true)
@Composable
fun CanvasView() {

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

        withTransform({
                translate(left= 600f)
                scale(scaleX = 2f,scaleY = 1f)
            }){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )
        }

        val cqs = size/2f
        inset(horizontal = 50f, vertical = 30f){
            drawArc(
                color = Color(0xFFF44336),
                size = cqs,
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )
        }


        translate(left = 100f,top = 100f){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = true
            )
        }

        scale(scaleX = 2f,scaleY = 1f){
            drawArc(
                color = Color(0xFFF44336),
                size = Size(size.width/2,size.height/4),
                startAngle = 0f,
                sweepAngle = 90f,
                useCenter = false
            )
        }

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

总结

本文介绍了Compose Canvas基础中图形转换相关的API,包括平移、缩放、旋转、自定义绘图区域及内边距、组合转换等内容。通过示例代码,演示了这些API的使用,希望对初学者有所帮助。

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

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

相关文章

1347. 制造字母异位词的最小步骤数 (中等,Counter)

闲来无事,今天多做一题 条件很宽,可以任意替换,且排列相同也可以所以只要统计每个字母在 s 中比在 t 中多出现的次数之和即可 class Solution:def minSteps(self, s: str, t: str) -> int:n [0] * 26for i in s:n[ord(i) - ord(a)] 1f…

通过商品ID查询天猫商品详情数据,可以拿到商品标题,商品价格,商品库存,商品销量,商品sku数据等,天猫API接口

通过商品ID查询天猫商品详情数据可以用淘宝开放平台的淘宝客商品详情查询接口(taobao.tbk.item.info.get)来完成。 首先需要申请一个淘宝开放平台的应用,并获取到App Key和App Secret,然后使用淘宝开放平台的淘宝客商品详情查询接…

常见的加密算法和类型

加密的类型有 对称加密算法 | 非对称加密算法 | hash算法 文章目录 对称加密算法非对称加密算法 (重点)hash加密算法 对称加密算法 对称加密算法 使用相同的密钥来进行加密和解密 数据通过密钥加密成密文 而密文也只能通过相同的密钥解密成数据 常见的对称加密算法 AES&…

洗地机什么牌子好用?洗地机排名

洗地机是如今清洁工作中非常重要的设备,它可以提高清洁效率,保持地面卫生,并减轻人力劳动的负担,市面上有许多不同品牌的洗地机,那么洗地机哪个牌子最好用呢?下面我们来介绍一下洗地机排名,并分析其热门型…

有哪些值得推荐的优秀 HTMLCSS 网站前端设计的网络资源(博客、论坛)?

前言 推荐几个有意思的CSS学习的网站和github上的学习类型的项目~ 网站推荐 1、CODEPEN 代码与所展示的页面相互对应,你可以在上面找到其他人已经写好的demo,参考 代码效果 网址:https://codepen.io 2、Coding Fantasy 通过游戏的形式来提…

mmlab 做实验

首先 下载项目完整代码,在pycharm中打开 1. comfig 中有各种网络模型,可以直接使用训练好的预训练模型,尽量不要改动网络模型的结构 2. 18表示网络机构18层,8是每个卡的batch,cifar10 是数据集 3.配置文件解析 4. …

SpringCloudSleuth异步线程支持和传递

场景 在使用Sleuth做链路跟踪时,默认情况下异步线程会断链,需要进行代码调整支持。 调整内容 方式一 使用Async实现异步线程 开启异步线程池 EnableAsync SpringBootApplication public class LizzApplication {public static void main(String[] a…

【Python中图像相似性度量方法全面总结】

文章目录 概要图像相似性概念基于直方图的相似性度量基于SSIM的相似性度量基于特征相似性的度量基于深度学习的方法小结 概要 在当今充斥着图像的世界中,衡量和量化图像之间的相似性已经成为一项至关重要的任务。不论是在图像检索、内容推荐还是视觉搜索等现代计算…

【LeetCode】148. 排序链表

148. 排序链表(中等) 方法一:归并排序(递归法) 思路 题目要求时间空间复杂度分别为 O(nlogn) 和 O(1) ,根据时间复杂度我们自然想到二分法,从而联想到归并排序; 对数组做归并排序的…

毫米波雷达在环境监测中的关键作用

随着环境问题的日益凸显,精确、实时的环境监测成为了保护地球的关键一环。在这个背景下,毫米波雷达技术逐渐崭露头角,以其在环境监测中的独特优势成为不可或缺的工具。本文将探讨毫米波雷达在环境监测中的关键作用,以及它是如何应…

Unity3D 基础——使用 Vector3.Lerp 实现缓动效果

让一个物体从当前位置移动到另一个位置 Vector3-Lerp - Unity 脚本 APIhttps://docs.unity.cn/cn/current/ScriptReference/Vector3.Lerp.html 1.在场景中新建两个 Cube 立方体,在 Scene 视图中将两个 Cude的位置错开。 2.新建 C# 脚本 MoveToTarget.cs&#xff08…

MS5542数模转换器可pin对pin兼容DAC8831

MS5541/MS5542 是一款单通道、16 位、串行输入、电压输出的数模转换器,采用 2.7V 至 5.5V 单电源供电,输出范围为 0V 至 VREF。在输出范围内保证单调性,在温度范围为-40C至85C 能够提供 1LSB INL 的 14 位精度。MS5541/MS5542 提供无缓冲输出…

如何绕过api的防重放做安全测试

一、问题引入:api接口测试,会检测请求头中的nonce参数的值,每次请求的值必须不同,否则发包失败 笔者在进行api接口的测试时(因为菜没有工具,只能另辟蹊跷),使用postmanxray进行安全测…

【LeetCode】《LeetCode 101》第十三章:链表

文章目录 13.1 数据结构介绍13.2 链表的基本操作206. 反转链表(简单)21. 合并两个有序链表(简单)24.两两交换链表中的节点(中等) 13.3 其它链表技巧160. 相交链表(简单)234. 回文链表…

Typora +Picgo 搭建个人笔记

文章目录 Typora Picgo 搭建个人笔记一、Picgo Github 搭建图床1.基础设置2. 将配置导出,方便下次使用 二、Typora:设置 :1. 基本设置2. 导出自动提交3. 备份图片 Typora Picgo 搭建个人笔记 typora 下载地址: https://zahui.fan…

使用UniApp实现视频数组自动下载与播放功能:一步步指导

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

阶段性总结

uart协议: 通用异步收发器 UART(Universal Asynchronous Receiver/Transmitter),是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位地传输,在UART通讯协议中信号线上的状态位高电平代表’1’&#xff0…

Java应用性能问题诊断技巧

作者:张彦东 参考:https://developer.aliyun.com/ebook/450?spma2c6h.20345107.ebook-index.28.6eb21f54J7SUYc 文章目录 (一)内存1.内存2.内存-JMX3.内存-Jmap4.内存-结合代码确认问题 (二)CPU1.CPU-JMX或…

短视频矩阵系统源码开发

短视频剪辑矩阵系统开发源码----源头搭建 一、源码技术构建源码部署搭建交付之---- 1.需要协助系统完成部署、接口全部正常接入、系统正常运行多久?7个工作日 2.需要准备好服务器以及备案域名 3.短视频SEO模块一年项目带宽,带宽最低要求10M,…

如何将电脑上的“小电影”隐藏为一张图片?这波操作绝了!!

大家好,我是冰河~~ 最近,有很多小伙伴想跟我学渗透。平时时间确实太忙了,除了要研发公司项目外,写公号,写博客,录视频,写书稿,维护开源项目,几乎占据了我全部的业余时间…