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

鸿蒙开发-想画圆角矩形?RoundRect的创建和圆角设置

想画圆角卡片和按钮?RoundRect 让你轻松搞定

在 APP 开发中,圆角矩形可能是最常见的 UI 元素了——卡片、按钮、输入框、头像框,几乎到处都是圆角。在 HarmonyOS 的 drawing 模块里,RoundRect类就是专门用来创建和操作圆角矩形的。

RoundRect 是什么?

简单说,RoundRect 就是一个"圆角矩形对象"。它在普通矩形的基础上,给四个角加上了圆角效果。你可以控制每个角的圆角半径,甚至让四个角的半径都不一样。

打个比方:普通矩形就像一块方方正正的砖头,RoundRect 就像一块被磨圆了角的鹅卵石。磨多大、磨哪个角,都由你来定。

创建一个圆角矩形

下面的流程图展示了 RoundRect 的创建和绘制完整流程:

定义矩形区域Rect

创建RoundRect对象

是否需要不同圆角?

使用统一圆角半径

用setCorner设置各角半径

左上角: TOP_LEFT_POS

右上角: TOP_RIGHT_POS

左下角: BOTTOM_LEFT_POS

右下角: BOTTOM_RIGHT_POS

创建Brush填充

Canvas.drawRoundRect绘制填充

创建Pen描边

Canvas.drawRoundRect绘制边框

最基本的创建方式是传入一个矩形区域和圆角半径:

import{common2D,drawing}from'@kit.ArkGraphics2D';letrect:common2D.Rect={left:100,top:100,right:500,bottom:300};letroundRect=newdrawing.RoundRect(rect,50,50);

这里有两个圆角半径参数:

xRadii:X 轴方向的圆角半径。值越大,圆角越"圆"。

yRadii:Y 轴方向的圆角半径。

为什么要分 X 和 Y 两个方向呢?因为你可以做出"椭圆形"的圆角效果。如果 xRadii 和 yRadii 相等,就是标准的圆角;如果不等,圆角就会变成椭圆弧。

有个重要规则:只有当 xRadii 和 yRadii 都大于 0 的时候,圆角才会生效。如果你传了 0 或负数,那创建出来的就是一个普通的直角矩形。

复制一个圆角矩形

从 API version 20 开始,你可以用拷贝构造函数来复制一个已有的圆角矩形:

import{common2D,drawing}from'@kit.ArkGraphics2D';letrect:common2D.Rect={left:100,top:100,right:500,bottom:300};letroundRect=newdrawing.RoundRect(rect,50,50);letroundRect2=newdrawing.RoundRect(roundRect);

roundRect2roundRect的一个副本,修改其中一个不会影响另一个。这在你需要基于一个基础样式创建多个变体时很有用。

给每个角设置不同的半径:setCorner

这是 RoundRect 最灵活的功能。你可以单独给四个角设置不同的圆角半径:

import{drawing}from'@kit.ArkGraphics2D';letroundRect:drawing.RoundRect=newdrawing.RoundRect({left:0,top:0,right:300,bottom:300},50,50);roundRect.setCorner(drawing.CornerPos.TOP_LEFT_POS,150,150);

setCorner的第一个参数是角的位置,用CornerPos枚举来指定:

  • TOP_LEFT_POS:左上角
  • TOP_RIGHT_POS:右上角
  • BOTTOM_LEFT_POS:左下角
  • BOTTOM_RIGHT_POS:右下角

后面两个参数是这个角在 X 和 Y 方向上的圆角半径。

实际用途举例

想做一个"对话气泡"效果,只有左上角是尖的,其他三个角是圆的?

letroundRect=newdrawing.RoundRect({left:0,top:0,right:200,bottom:100},10,10);roundRect.setCorner(drawing.CornerPos.TOP_LEFT_POS,0,0);// 左上角不要圆角

想做一个"标签页"效果,只有上面两个角是圆的?

letroundRect=newdrawing.RoundRect({left:0,top:0,right:200,bottom:50},10,10);roundRect.setCorner(drawing.CornerPos.BOTTOM_LEFT_POS,0,0);roundRect.setCorner(drawing.CornerPos.BOTTOM_RIGHT_POS,0,0);

读取某个角的半径:getCorner

想知道某个角当前的圆角半径是多少?用getCorner

import{drawing}from'@kit.ArkGraphics2D';letroundRect:drawing.RoundRect=newdrawing.RoundRect({left:0,top:0,right:300,bottom:300},50,50);letcornerRadius=roundRect.getCorner(drawing.CornerPos.BOTTOM_LEFT_POS);console.info("getCorner---"+cornerRadius.x)console.info("getCorner---"+cornerRadius.y)

返回的是一个Point对象,x是 X 方向的半径,y是 Y 方向的半径。

移动圆角矩形:offset

offset方法可以让整个圆角矩形在画布上平移:

import{drawing}from'@kit.ArkGraphics2D';letroundRect:drawing.RoundRect=newdrawing.RoundRect({left:0,top:0,right:300,bottom:300},50,50);roundRect.offset(100,100);

offset(100, 100)表示向右移动 100px,向下移动 100px。传负数就是往反方向移动。

这个方法直接修改的是 RoundRect 对象本身的位置,不会改变它的大小和圆角半径。

怎么把 RoundRect 画出来?

创建好 RoundRect 之后,你需要用 Canvas 来绘制它。基本流程是:

  1. 创建 RoundRect 对象
  2. 创建 Brush 或 Pen
  3. 用 Canvas 的drawRoundRect方法绘制
import{RenderNode}from'@kit.ArkUI';import{common2D,drawing}from'@kit.ArkGraphics2D';classDrawingRenderNodeextendsRenderNode{draw(context:DrawContext){constcanvas=context.canvas;// 创建圆角矩形letroundRect=newdrawing.RoundRect({left:50,top:50,right:350,bottom:200},20,20);// 创建画刷letbrush=newdrawing.Brush();brush.setColor({alpha:255,red:100,green:150,blue:255});canvas.attachBrush(brush);// 绘制填充的圆角矩形canvas.drawRoundRect(roundRect);// 创建画笔画边框letpen=newdrawing.Pen();pen.setColor({alpha:255,red:0,green:0,blue:0});pen.setStrokeWidth(2);canvas.attachPen(pen);canvas.drawRoundRect(roundRect);}}

这段代码先用蓝色 Brush 填充圆角矩形,再用黑色 Pen 描边,做出了一个带边框的蓝色圆角卡片效果。

实际应用场景

下面的流程图展示了不同场景下圆角半径的选择策略:

小按钮/输入框

卡片/对话框

突出卡片/模态框

头像/标签

对话气泡

标签页

选择圆角半径

UI元素类型

4-8px轻微圆角

12-16px标准圆角

20-30px大圆角

宽高一半: 圆形/胶囊形

三圆角+一直角

setCorner设置一个角半径为0

上两角圆+下两角直

setCorner设置下两角半径为0

场景一:卡片式布局

现在几乎所有 APP 都用卡片式设计。用 RoundRect 可以轻松创建各种卡片:

// 标准圆角卡片letcard=newdrawing.RoundRect({left:20,top:20,right:380,bottom:200},12,12);// 大圆角卡片(更"胖"的感觉)letbigCard=newdrawing.RoundRect({left:20,top:20,right:380,bottom:200},24,24);// 胶囊按钮(圆角半径等于高度的一半)letcapsule=newdrawing.RoundRect({left:20,top:20,right:180,bottom:70},25,25);

场景二:头像框

圆形头像框其实就是圆角半径足够大的正方形:

// 100x100 的正方形,圆角半径 50,就是圆形letavatarFrame=newdrawing.RoundRect({left:0,top:0,right:100,bottom:100},50,50);

场景三:对话气泡

微信风格的对话气泡,一边是圆角,一边有个小尖角:

letbubble=newdrawing.RoundRect({left:0,top:0,right:200,bottom:80},10,10);bubble.setCorner(drawing.CornerPos.TOP_LEFT_POS,0,0);// 左上角不圆

场景四:进度条背景

圆角进度条的背景:

letprogressBg=newdrawing.RoundRect({left:20,top:100,right:380,bottom:120},10,10);

圆角半径的选择建议

  • 4-8px:轻微圆角,适合小按钮、输入框
  • 12-16px:标准圆角,适合卡片、对话框
  • 20-30px:大圆角,适合突出的卡片、模态框
  • 等于宽高的一半:圆形/胶囊形,适合头像、标签

注意事项

  1. API 版本:RoundRect 从 API version 12 开始支持,拷贝构造函数从 API version 20 开始。

  2. 半径必须大于 0:如果 xRadii 或 yRadii 小于等于 0,圆角不会生效,会变成普通矩形。

  3. 物理像素:所有尺寸单位都是物理像素 px。

  4. 线程安全:和其他 drawing 对象一样,是单线程模型。

  5. 半径不能超过短边的一半:如果圆角半径超过了矩形短边长度的一半,实际效果会被限制在短边的一半。

小结

RoundRect 是 drawing 模块里专门处理圆角矩形的工具类。它的核心功能就是创建圆角矩形,然后你可以用setCorner给每个角设置不同的半径,用offset来移动位置。

虽然功能看起来简单,但在实际 APP 开发中,圆角矩形的使用频率非常高。掌握了 RoundRect,你就能轻松实现各种卡片、按钮、对话框的绘制了。

http://www.gsyq.cn/news/1424412.html

相关文章:

  • 内存泄漏疑云:订阅事件未取消、Timer未释放、Image未Dispose
  • 今日算法(回溯找IP,加检测)
  • 2026最新测评:16款降AIGC软件实测,闭眼入这款就对了!
  • 【Lindy审核自动化黄金标准】:为什么92%的AI审核项目在第3周就失败?
  • 仅剩72小时!Lindy v5.8.2强制TLS 1.3升级倒计时:未适配自动化链路将批量中断——紧急迁移四步法
  • 从零打造智能杯垫:Arduino电路设计与木工工艺融合实践
  • 告别信号失真!用LTC6268-10这颗4GHz FET运放,搞定你的高阻抗传感器放大难题
  • RHEL8系统管理员必看:用ELRepo源安全升级内核到kernel-ml主线版(附CentOS7替代方案)
  • 嘴型训练数据集 嘴型数据集 可用于训练wav2lip模型 史上最数字人嘴型训练数据集
  • 3步搞定抖音无水印下载:douyin-downloader高效工作流全解析
  • 2026自贡提供免费量房出方案家装品牌排行:自贡装修设计效果图定制、自贡诚信透明报价装修、自贡轻奢风装修设计预算选择指南 - 优质品牌商家
  • 3分钟掌握Sketchfab下载神器:Firefox用户脚本完全指南
  • 从原理到代码,拆解 Transformer 自注意力机制与多头结构
  • 基于ESP32-S3的便携式鼓机:从PWM音频合成到3D打印外壳的完整DIY实践
  • AWS EC2 Windows Server 2012升级2016实战:从备份到SSM修复的完整避坑手册
  • 异步里捕获 this?我被坑到想哭
  • 2026年淬火炉实测评测:主流品牌核心性能对比 - 优质品牌商家
  • 【AI面试临阵磨枪-087】Skill 生命周期:注册、加载、调度、熔断、卸载、版本管理?
  • 056、HDR 合成后画面诡异、发灰?多曝光对齐、鬼影消除与 Tone Mapping 调优方案
  • Cadence OrCAD层次化设计进阶:像管理代码分支一样管理你的电路模块
  • Claude研究报告生成:从零到专业级输出的7步标准化工作流(含Prompt工程黄金公式)
  • 2026年回火炉实测评测:烧结炉/网带炉/退火炉/钎焊炉/光亮炉/台车炉/回火炉/正火炉/工艺性能与服务维度对比 - 优质品牌商家
  • 3步部署WenQuanYi Micro Hei:解锁高效中文显示的轻量级解决方案
  • 赛普拉斯代理现货库存CYUSB3014-BZXC高性能USB 3.0外设控制器芯片
  • 保姆级教程:用Matlab/Simulink+CarSim复现平行泊车仿真(附模型文件与避坑点)
  • 抖音音频提取革命:3分钟搞定批量下载的开源神器
  • CSS Transitions 过渡效果详解
  • Claude生成代码质量究竟如何?37项实测指标揭穿90%开发者忽略的隐藏风险
  • 【雷达干扰】FMCW 雷达稀疏低秩 Hankel 矩阵分解的干扰抑制附Matlab代码
  • 2026年近期,如何选择行业知名的液压马达定制厂家? - 2026年企业资讯