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

android compose DrawScope - Canvas 使用

android compose DrawScope - Canvas 使用

在 Compose 中绘制自定义内容的核心方法是使用修饰符,例如 Modifier.drawWithContent、Modifier.drawBehind 和 Modifier.drawWithCache。

如果您只需使用可组合项进行绘制,可使用 Canvas 可组合项。Canvas可组合项是一个包裹 Modifier.drawBehind 的便利封装容器。在布局中放置Canvas的方式与放置其他 Compose UI 元素相同。在Canvas中,您可以通过精确控制元素的样式和位置来绘制元素。

所有绘制修饰符都会提供 DrawScope(一个维护自身状态且限定了作用域的绘制环境),可供您为一组图形元素设置参数。DrawScope提供了几个有用的字段,例如size(用于指定DrawScope的当前尺寸的Size对象)。

package com.wn.androidcomposedemo1.basegoogleimage import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Canvas import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.drawscope.DrawScope 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.res.imageResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.wn.androidcomposedemo1.R import com.wn.androidcomposedemo1.ui.theme.AndroidComposeDemo1Theme /** * Author : wn * Email : maoning20080808@163.com * Date : 2026/7/3 16:21 * Description : * 在 Compose 中绘制自定义内容的核心方法是使用修饰符,例如 Modifier.drawWithContent、Modifier.drawBehind 和 Modifier.drawWithCache。 */ class DrawScopeActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AndroidComposeDemo1Theme() { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { DrawScopeExample() } } } } @Composable fun DrawScopeExample(){ Column(horizontalAlignment = Alignment.CenterHorizontally) { Spacer(Modifier.height(20.dp)) Text("使用DrawScope - Canvas绘制", fontSize = 20.sp, color = Color.Red) Spacer(Modifier.height(20.dp)) var showScale by remember { mutableStateOf(false) } var showTranslate by remember { mutableStateOf(false) } var showRotate by remember { mutableStateOf(false) } var showImage by remember { mutableStateOf(false) } Row(horizontalArrangement = Arrangement.Center) { Button(onClick = { showScale = !showScale; }) { Text("缩放") } Spacer(Modifier.width(20.dp)) Button(onClick = { showTranslate = !showTranslate }) { Text("平移") } Spacer(Modifier.width(20.dp)) Button(onClick = { showRotate = !showRotate }) { Text("旋转") } Spacer(Modifier.width(20.dp)) Button(onClick = { showImage = !showImage }) { Text("绘制图片") } } DrawScopeScaleExample(showScale) DrawScopeTranslateExample(showTranslate) DrawScopeRotateExample(showRotate) DrawScopeImageExample(showImage) } } //缩放 @Composable fun DrawScopeScaleExample(showScale : Boolean){ if(showScale){ Canvas(modifier = Modifier.fillMaxSize()) { scale(scaleX = 3f, scaleY = 5f){ drawCircle(Color.Blue, radius = 20.dp.toPx()) } } } } //平移 @Composable fun DrawScopeTranslateExample(showTranslate : Boolean){ if(showTranslate){ Canvas(modifier = Modifier.fillMaxSize()) { translate(left = 100f, top = -300f) { drawCircle(Color.Red, radius = 100.dp.toPx()) } } } } //旋转 @Composable fun DrawScopeRotateExample(showRotate: Boolean){ if(showRotate){ Canvas(modifier = Modifier.fillMaxSize()){ rotate(degrees = 45f){ drawRect( color = Color.Gray, topLeft = Offset(x = size.width/3f, y = size.height / 3f), size = size / 3f ) } } } } //绘制图片 @Composable fun DrawScopeImageExample(showImage : Boolean){ val dogImage = ImageBitmap.imageResource(id = R.drawable.dog) if(showImage){ Canvas(modifier = Modifier.fillMaxSize().padding(start = 20.dp, top = 20.dp), onDraw = { drawImage(dogImage) }) } } }
http://www.jsqmd.com/news/1116834/

相关文章:

  • 如何让微信聊天记录成为你的个人数字资产?WeChatMsg数据主权解决方案深度解析
  • DeepSeek-V4大模型训练硬件选型:昇腾与英伟达分层协同实战指南
  • TikTok自动化神器:TikTokPy高性能异步架构深度解析
  • 项目进度实时监控与资源优化:项目制服务解决方案落地方法论
  • WinUtil:5分钟搞定Windows系统优化与软件管理的终极工具箱完整指南
  • USB3.0总线高速数据采集卡,8通道、16位分辨率、5MHz同步采样,程控增益±10V、±5V、±2V、±1V
  • 多智能体事实核查系统:LangChain+Groq落地实践
  • 京东开源 JoyAI-Echo:5 分钟长视频一次生成,音画同步不崩脸!
  • 2026论文顶级AI智能降重工具大曝光:三步操作让AI痕迹消失无踪
  • 想提升企业资源管理效能?ERP系统优化是关键!
  • 周刊(创刊号)第一期准备发布,共同投稿完成此事业
  • 不锈钢拉丝设备中干式拉丝和湿式拉丝(包括水磨和油磨)的共同点和区别
  • 微信小程序逆向分析实战:从.wxapkg解密到动态Hook
  • AI写作合规技术拆解:从平台检测机制到合规Workflow实战
  • nRF52840如何在arduino中生成uf2文件
  • 深圳具身智能新独角兽跨维智能获10亿B轮融资,投后估值超百亿将启IPO!
  • Qwen3vl+Midscene+Playwright自动化AI测试框架搭建流程(win11本地安装)
  • 构建常态化反钓鱼训练体系:从战略框架到实战部署
  • 2026淮北黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • 本地视频生成大模型
  • 用GPT-5.5重构遗留项目:一套可复用的迁移脚本分享(附避坑指南与教程)
  • GPT高效落地实战:日常工作与学习任务优化全流程方法论
  • 如何通过FactoryBluePrints蓝图库实现戴森球计划全周期工厂效率优化
  • 零代码本地部署LLM:消费级硬件跑通生产级大模型应用
  • HoRain云--Java多线程编程:6种实战技巧与避坑指南
  • LENA-R8与PIC18LF45K22的全球连接与低功耗定位方案
  • STM32与Si4731实现FM收音机开发全攻略
  • 好用的平衡机创新机构
  • 你用AI写分析文,总觉得像拼凑的?问题不在AI,在流程
  • 2026黄冈黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式