HarmonyOS ArkUI Canvas(你相信光吗?)

这篇具有很好参考价值的文章主要介绍了HarmonyOS ArkUI Canvas(你相信光吗?)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

昨天华为mate60提前发售,网上流传,麒麟9000s,“4G改””,“突破列强科技封锁”等字眼流传在各大社交平台,我对着那些mate60相关文章左看右看,上看下看,竟从密密麻麻的文字中看出四个字——“遥遥领先

其实起因是在掘金沸点看见这么一个表情包,然后就用HarmonyOS ArkUI 的 Canvas画了一个神光棒(我没有说华为是国产之光啊,叠甲)。不跑偏了,我们今天通过画这个神光棒来熟悉下HarmonyOS ArkUI 的 Canvas

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习


一、Canvas是什么?

Canvas是 ArkUI 提供的画布组件,用于自定义绘制图形。它使用类似于HTML5 Canvas的方式进行绘制,可以实现高效、灵活的自定义UI界面。Canvas可以实现在画布上自由绘制图形,包括线条、矩形、圆形、文本、图片等,并且可以通过控制绘制顺序和渲染顺序来实现图层管理和遮盖效果。

参数:

参数名 参数类型 必填 默认值 参数描述
context CanvasRenderingContext2D - 见CanvasRenderingContext2D对象。

二、画神光棒

想要画一个神光棒,我们要先将它拆解,看看它由什么组成,然后我们就得到了如下公式:

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

神光棒 = 圆 + 左边的多边形 + 右边的多边形 + 连接部分 + 棒身 + 底座 神光棒 = 圆+左边的多边形+右边的多边形+连接部分+棒身+底座 神光棒=+左边的多边形+右边的多边形+连接部分+棒身+底座

得到公式后我们一步一步将其画出来,在开始使用Canvas组件之前,我们需要先初始化CanvasRenderingContext2D

private settings: RenderingContextSettings = new RenderingContextSettings(true)
 private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

然后用这个context初始化

      Canvas(this.context)
        .width('100%')
        .height('100%')
        .onReady(() => {
          })

接下来的所有绘画工作都将在onReady方法中进行,context自带宽高属性,代表了控件的宽高以方便我们绘制

 		  let width = this.context.width
          let height = this.context.height

1.绘制神光棒左右侧

代码如下(示例):

		  this.context.lineWidth = 2

		  this.context.beginPath()
          this.context.moveTo(width/2, height/4)
          this.context.lineTo(width/4, height/8)
          this.context.lineTo(width/4, height/3)
          this.context.arcTo(width/4, height/2, width/2, height/2, 90)
          this.context.closePath()
          this.context.stroke()

解释

  1. beginPath():beginPath() 是 canvas 的方法之一,它的作用是创建一个新路径,用于绘制图形。新路径创建后,之前绘制的路径和样式将被清空。在开始绘制新的路径之前,我们通常需要调用此方法来创建一个新的路径对象。

  2. moveTo():的moveTo方法是用于将画笔移动到指定的坐标点。具体语法如下:
    -public void moveTo(float x, float y) 其中,x和y分别表示坐标点的横纵坐标。

  3. lineTo(): lineTo方法用于在指定坐标处开始绘制一条直线。其语法与moveTo相同

  4. arcTo(): arcTo() 是 Canvas API 中的路径绘制方法之一。它用于绘制一段弧线,该弧线的起点和终点是已知的,但是中间的弧度大小和轨迹需要通过控制点来控制。

arcTo() 方法有四个参数,前两个参数是控制点坐标,中间两个参数是终点坐标。它的语法如下:

context.arcTo(x1, y1, x2, y2, radius)

在绘制路径时,我们通常先用 moveTo() 方法来设置路径的起始点,然后用 arcTo() 方法来绘制一段弧线,最后用 lineTo() 或者其它路径绘制方法来补充路径的其它部分。

使用 arcTo() 方法需要注意以下几点:

  • 路径的起始点不能和弧线的起点重合;
  • 控制点的坐标和终点的坐标必须在同一直线上;
  • 控制点和终点的距离必须大于弧线的半径,否则将无法绘制出弧线;
  • 如果要绘制出多段弧线,每段弧线的起点和上一段弧线的终点必须重合,否则将会形成断点。
  1. closePath():用于将当前笔画的起点和终点连接起来,形成一个封闭路径。当调用 closePath() 后,下一次的绘制操作就会从路径的起点开始,而不是继续上一次路径的终点。路径的起点默认是最后一个 moveTo() 方法所设置的点。如果当前路径没有进行 moveTo() 操作,则起点自动设置为 (0, 0)。在 closePath() 之后,你可以通过 fill() 或 stroke() 方法来填充或描边路径。如果当前路径没有形成封闭路径(即起点和终点未连接),则 closePath() 方法不会产生任何效果。

  2. stroke():用于设置描边样式的方法。它可以用于设置图形的描边颜色、宽度和样式。

     context.stroke()
    

stroke() 方法通常在绘制完图形的路径后调用。调用该方法将当前描边样式应用于路径,并在画布上绘制描边路径。

在调用该方法之前,您可以通过以下方法设置描边样式:

  • context.strokeStyle :设置描边颜色。可以是一个字符串值,如“red”或“#FF0000”,也可以是 CanvasGradient 或 CanvasPattern 对象。
  • context.lineWidth :设置描边线宽度,单位为像素。
  • context.lineCap :设置线条的端点样式,可以是 butt(默认)、round 或 square。
  • context.lineJoin :设置线条的连接点样式,可以是 miter(默认)、round 或 bevel。
  • context.miterLimit :设置斜角的限制比例,只有当 lineJoin 为 miter 时才有效。

效果如下:

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

同理,我们只需要变换一下位置坐标,就能将右侧画出来

          this.context.beginPath()
          this.context.moveTo(width/2, height/4)
          this.context.lineTo(width/4*3, height/8)
          this.context.lineTo(width/4*3, height/3)
          this.context.arcTo(width/4*3, height/2, width/2, height/2, 90)
          // this.context.closePath()
          this.context.stroke()

效果入下

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

2.中心圆形

代码如下(示例):

 		  this.context.beginPath()
          this.context.arc(width/2, height/3, 40, 0, 360)
          // this.context.stroke()
          var grad = this.context.createRadialGradient(200,200,50, 200,200,200)
          grad.addColorStop(0.0, '#ffd7d556')
          grad.addColorStop(1.0, '#ffcdc555')
          grad.addColorStop(0.5, '#ffffff')
          this.context.fillStyle = grad
          this.context.fill()

解释:

  1. arc(): arc 方法是用来绘制圆弧的。

该方法的语法如下:

public void arc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

参数说明:

  • left:圆弧所在矩形的左边界坐标;
  • top:圆弧所在矩形的上边界坐标;
  • ight:圆弧所在矩形的右边界坐标;
  • bottom:圆弧所在矩形的下边界坐标;
  • startAngle:圆弧起始角度,以度数表示;
  • sweepAngle:圆弧扫描角度,以度数表示;
  • useCenter:是否绘制扇形,默认为 false,表示绘制圆弧;
  • paint:绘制圆弧所使用的画笔。

使用 arc 方法可以画出各种圆弧,如扇形、半圆等。同时,通过设置 startAngle 和 sweepAngle 可以绘制出不同的圆弧形状。

  1. createRadialGradient 用于创建一个放射性渐变的函数,也就是实现在给定的两个圆之间进行颜色渐变的功能。具体来说,该方法接收6个参数:
  • centerX: 渐变圆的中心点横坐标。
  • centerY: 渐变圆的中心点纵坐标。
  • radius: 渐变圆的半径。
  • centerX2: 第二个渐变圆的中心点横坐标。
  • centerY2: 第二个渐变圆的中心点纵坐标。
  • radius2: 第二个渐变圆的半径。

该方法会返回一个渐变对象,可以在canvas上使用该对象进行绘制。

效果如下:

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

其他部分

熟悉了上面的几个Canvas相关的api,剩下的部分稍微动下脑筋,就可以将中间,棒棒和底座一次搞定 啦,代码如下:

          //神光棒中间
          this.context.beginPath()
          this.context.moveTo(width/2-50, height/2)
          this.context.lineTo(width/2+50, height/2)
          this.context.lineTo(width/2+50, height/2+25)
          this.context.lineTo(width/2-50, height/2+25)
          this.context.closePath()
          this.context.stroke()
          this.context.fillStyle = "#eee7b0"
          this.context.fill()

          //神光棒棒棒
          this.context.beginPath()
          this.context.moveTo(width/2-25, height/2+25)
          this.context.lineTo(width/2-25, height/2+25+200)
          this.context.lineTo(width/2+25, height/2+25+200)
          this.context.lineTo(width/2+25, height/2+25)
          this.context.closePath()
          this.context.stroke()


          //神光棒底座
          this.context.beginPath()
          this.context.moveTo(width/2-30, height/2+25+200)
          this.context.lineTo(width/2+30, height/2+25+200)
          this.context.lineTo(width/2+30, height/2+25+200+30)
          this.context.lineTo(width/2-30, height/2+25+200+30)
          this.context.closePath()
          this.context.stroke()
          this.context.fillStyle = "#eee7b0"
          this.context.fill()

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

最后再加上一个倾斜,所有人都可以变成光!

          this.context.rotate(-10 * Math.PI / 180)

HarmonyOS ArkUI Canvas(你相信光吗?),鸿蒙OS,harmonyos,android,华为,学习

完整代码:

// @ts-nocheck
@Entry
@Preview
@Component
struct Index {
  
  private settings: RenderingContextSettings = new RenderingContextSettings(true)
  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Canvas(this.context)
        .width('100%')
        .height('100%')
        .onReady(() => {
          let width = this.context.width
          let height = this.context.height
          this.context.lineWidth = 2

          this.context.rotate(-10 * Math.PI / 180)



          //神光棒左侧
          this.context.beginPath()
          this.context.moveTo(width/2, height/4)
          this.context.lineTo(width/4, height/8)
          this.context.lineTo(width/4, height/3)
          this.context.arcTo(width/4, height/2, width/2, height/2, 90)
          this.context.closePath()
          this.context.stroke()

          //神光棒右侧
          this.context.beginPath()
          this.context.moveTo(width/2, height/4)
          this.context.lineTo(width/4*3, height/8)
          this.context.lineTo(width/4*3, height/3)
          this.context.arcTo(width/4*3, height/2, width/2, height/2, 90)
          // this.context.closePath()
          this.context.stroke()

          //中心圆形
          this.context.beginPath()
          this.context.arc(width/2, height/3, 40, 0, 360)
          // this.context.stroke()
          var grad = this.context.createRadialGradient(200,200,50, 200,200,200)
          grad.addColorStop(0.0, '#ffd7d556')
          grad.addColorStop(1.0, '#ffcdc555')
          grad.addColorStop(0.5, '#ffffff')
          this.context.fillStyle = grad
          this.context.fill()



          //神光棒中间
          this.context.beginPath()
          this.context.moveTo(width/2-50, height/2)
          this.context.lineTo(width/2+50, height/2)
          this.context.lineTo(width/2+50, height/2+25)
          this.context.lineTo(width/2-50, height/2+25)
          this.context.closePath()
          this.context.stroke()
          this.context.fillStyle = "#eee7b0"
          this.context.fill()

          //神光棒棒棒
          this.context.beginPath()
          this.context.moveTo(width/2-25, height/2+25)
          this.context.lineTo(width/2-25, height/2+25+200)
          this.context.lineTo(width/2+25, height/2+25+200)
          this.context.lineTo(width/2+25, height/2+25)
          this.context.closePath()
          this.context.stroke()


          //神光棒底座
          this.context.beginPath()
          this.context.moveTo(width/2-30, height/2+25+200)
          this.context.lineTo(width/2+30, height/2+25+200)
          this.context.lineTo(width/2+30, height/2+25+200+30)
          this.context.lineTo(width/2-30, height/2+25+200+30)
          this.context.closePath()
          this.context.stroke()
          this.context.fillStyle = "#eee7b0"
          this.context.fill()


        })




    }
    .width('100%')
    .height('100%')
  }

}function centerX<T>(x: any,arg1: number,y: any,arg3: number,z: any,arg5: number,centerX: any,arg7: number,centerY: any,arg9: number) {
throw new Error('Function not implemented.')
}


总结

在编译器的heip->API Reference->画布组件中可以看到Canvans相关的API及介绍,本文参考API文档绘制神光棒,迪迦!文章来源地址https://www.toymoban.com/news/detail-685777.html

到了这里,关于HarmonyOS ArkUI Canvas(你相信光吗?)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 鸿蒙HarmonyOS实战-ArkUI事件(键鼠事件)_ark ui 点击事件

    .onMouse((event: MouseEvent) = { event.stopPropagation(); // 在Button的onMouse事件中设置阻止冒泡 this.buttonText = ‘Button onMouse:n’ + ‘’ + \\\'button = ’ + event.button + ‘n’ + \\\'action = ’ + event.action + ‘n’ + ‘x,y = (’ + event.x + ‘,’ + event.y + ‘)’ + ‘n’ + ‘screenXY=(’ + event.screenX + ‘,’ + eve

    2024年04月16日
    浏览(50)
  • 详细教程 - 进阶版 鸿蒙harmonyOS应用 第十八节——鸿蒙OS应用性能优化指南

    性能优化是提升鸿蒙OS应用质量的重要手段。优化的角度包括加载速度、CPU使用率、内存占用、电量消耗、网络流量等多个方面。 本文将通俗解释性能表现的影响因素,并结合实例提供有效的检测分析方法与优化策略建议,帮助开发者系统地提升应用性能与用户体验。 2.1 加载时

    2024年01月16日
    浏览(55)
  • 鸿蒙HarmonyOS应用开发能找到工作么?_harmony os 应用开发前景

    四、如何学习鸿蒙HarmonyOS应用开发技术? 为了能够帮助大家快速掌握鸿蒙(Harmony NEXT)应用开发技术知识。 首先得是开发语言 ArkTS,这个尤为重要,然后就是ArkUI声明式UI开发、Stage模型、网络/数据库管理、分布式应用开发、进程间通信与线程间通信技术、OpenHarmony多媒体技

    2024年04月27日
    浏览(42)
  • 【HarmonyOS开发】ArkUI-X 跨平台框架(使用ArkTs开发Android&IOS)

    ArkUI-X 跨平台框架进一步将 ArkUI 开发框架扩展到了多个OS平台,目前支持OpenHarmony、HarmonyOS、Android、 iOS,后续会逐步增加更多平台支持。开发者基于一套主代码,就可以构建支持多平台的精美、高性能应用。 React Native 是一个基于 JavaScript 和 React 的开源框架,由 Facebook 开发和

    2024年01月20日
    浏览(49)
  • HarmonyOS ArkUI实战开发—状态管理

    在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。 自定义组件拥有变量,变量必须

    2024年04月27日
    浏览(40)
  • HarmonyOS实战经验合集之ArkUI(二)

    ArkUI(方舟开发框架):是一套UI开发框架,提供开发者进行应用UI开发时所必须的能力。 1)组件:组件是界面搭建与显示的最小单位。开发者通过多种组件的组合,构建出满足自身应用诉求的完整界面。 2)页面:page页面是ArkUI最小的调度分割单位。开发者可以将应用设计为

    2023年04月09日
    浏览(36)
  • 基于HarmonyOS ArkUI实现音乐列表功能

    本节将演示如何在基于HarmonyOS ArkUI的List组件来实现音乐列表功能。 本文涉及的所有源码,均可以在文末链接中找到。 华为开发者论坛 规则要求具体要求如下: 第1步:观看HarmonyOS第一课“营”在暑期•系列直播,一步步学会基于HarmonyOS最新版本的应用开发。 第2步:基于自

    2024年02月11日
    浏览(43)
  • 【HarmonyOS开发】ArkUI实现下拉刷新/上拉加载

     列表下拉刷新、上拉加载更多,不管在web时代还是鸿蒙应用都是一个非常常用的功能,基于ArkUI中TS扩展的声明式开发范式实现一个下拉刷新,上拉加载。 如果数据量过大,可以使用LazyForEach代替ForEach 高阶组件-上拉加载,下拉刷新 https://gitee.com/bingtengaoyu/harmonyos-advanced-com

    2024年01月20日
    浏览(41)
  • HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

    上一节笔者给大家讲解了 JS 引擎解释执行到  import  语句的加载流程,总结起来就是利用  dlopen()  方法的加载特性向  NativeModuleManager  内部的链接尾部添加一个  NativeModule ,没有阅读过上节文章的小伙伴,笔者强烈建议阅读一下,本节笔者继续给大家讲解 JS 调用 C++ 方法

    2024年04月27日
    浏览(41)
  • 【HarmonyOS4.0】第七篇-ArkUI系统组件(二)

    鸿蒙开发系统组件详细剖析 进度条也是UI开发最常用的组件之一,ArkUI开发框架提供了两种类型的进度条: Progress 和 LoadingProgress ,前者可以精准指定进度,后者表示正在加载的状态,我们接下来对它们分别做下介绍。 5.1.Progress 5.1.1.Progress定义介绍 Progress 组件可以精确的设置

    2024年02月01日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包