范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

华为大佬解析开源鸿蒙OpenHarmony3。1关键特性画布,教你如何完成飞机大战小游戏

  IT之家 2 月 10 日消息,华为技术有限公司的江英杰为大家揭晓了关于开源鸿蒙 OpenHarmony 3.1 Beta 版中的一个关键特性,也就是ArkUI 开发框架中的 canvas 画布。
  据介绍,canvas 是 ArkUI 开发框架里的画布组件,常用于自定义绘制图形。因为其轻量、灵活、高效等优点,被广泛应用于 UI 界面开发中。本期,我们将为大家介绍 ArkUI 开发框架中 canvas 组件的使用。canvas 介绍
  1.1 什么是 canvas?
  IT之家了解到,在 Web 浏览器中,canvas 是一个可自定义 width、height 的矩形画布,画布左上角为坐标原点,以像素为单位,水平向右为 x 轴,垂直向下为 y 轴,画布内所有元素都基于原点进行定位。
  如下图所示,我们可以通过 <canvas> 标签,创建了一个 width= 1500px,height=900px 的空白画布,我们还需要"画笔"才能绘制图形。canvas 采用轻量的逐像素渲染机制,以 JS 为"画笔"直接控制画布像素,从而实现图形绘制。
  1.2 Canvas 的"画笔"
  canvas 本身虽不具备绘制能力,但是提供了获取"画笔"的方法。开发者可通过 getContext ("2d") 方法获取 CanvasRenderingContext2D 对象完成 2D 图像绘制,或通过 getContext ("webgl") 方法获取 WebGLRenderingContext 对象完成 3D 图像绘制。
  目前,ArkUI 开发框架中的 WebGL1.0 及 WebGL2.0 标准 3D 图形绘制能力正在完善中,所以本文将着重介绍 2D 图像的绘制。如下图所示,是 CanvasRenderingContext2D 对象提供的部分 2D 图像绘制方法,丰富的绘制方法让开发者能高效地绘制出矩形、文本、图片等。
  除此之外,开发者还可以通过获取 OffscreenCanvasRenderingContext2D 对象进行离屏绘制,绘制方法同上。当绘制的图形比较复杂时,频繁地删除与重绘会消耗很多性能。
  这时,开发者可以根据自身的需求灵活选取离屏渲染的方式,首先通过创建 OffscreenCanvas 对象作为一个缓冲区,然后将内容绘制在 OffscreenCanvas 上,最后再将 OffscreenCanvas 绘制到主画布上,以提高画布性能,确保绘图的质量。canvas 基础绘制方法
  通过上节对 canvas 组件的基本介绍,相信大家对 canvas 组件已经有了一定的认识,下面我们将为大家实际演示 canvas 组件在 ArkUI 开发框架中的使用方法。ArkUI 开发框架参考了 Web 浏览器中 canvas 的设计,并在"类 Web 开发范式"及"声明式开发范式"两种开发范式中进行提供,接下来我们将分别介绍这两种开发范式中 canvas 的绘制方法。
  2.1 类 Web 开发范式中 canvas 的绘制方法
  类 Web 开发范式,使用 HML 标签文件进行布局搭建、CSS 文件进行样式描述,并通过 JS 语言进行逻辑处理。目前,JS 语言的 canvas 绘图功能已经基本上完善,下面我们将通过两个示例,展示基于 JS 语言的 canvas 组件基础使用方法。
  2.1.1 矩形填充
  CanvasRenderingContext2D 对象提供了 fillRect (x, y, width, height) 方法,用于绘制一个填充的矩形。如下图所示,在画布内绘制了一个黑色的填充矩形,x 与 y 指定了在 canvas 画布上所绘制的矩形的左上角(相对于原点)的坐标,width 和 height 则设置了矩形的尺寸。
  示例代码如下://创建一个width=1500px,height=900px的画布<!--xxx.hml--><div><canvasref="canvas"style="width:1500px;height:900px;"></canvas></div>//xxx.jsexportdefault{onShow(){constel=this.$refs.canvas;//获取2D绘制对象constctx=el.getContext("2d");//设置填充为黑色ctx.fillStyle="#000000";//设置填充矩形的坐标及尺寸ctx.fillRect(200,200,300,300);}}
  2.1.2 缩放与阴影
  CanvasRenderingContext2D 对象提供了 scale (x,y) 方法,参数 x 表示横轴方向上缩放倍数,y 表示纵轴方向上缩放的倍数,值得注意的是缩放过程中定位也会被缩放。如下图所示,是将上个示例中的填充矩形通过 scale (2,1.5) 缩放,并通过 shadowBlur 方法加上阴影后的效果。
  示例代码如下://xxx.jsexportdefault{onShow(){constel=this.$refs.canvas;constctx=el.getContext("2d");//设置绘制阴影的模糊级别ctx.shadowBlur=80;ctx.shadowColor="rgb(0,0,0)";ctx.fillStyle="rgb(0,0,0)";//xScaleto200%,yScaleto150%ctx.scale(2,1.5);ctx.fillRect(200,200,300,300);}}
  2.2 声明式开发范式中 canvas 的绘制方法
  声明式开发范式,采用 TS 语言并进行声明式 UI 语法扩展,从组件、动效和状态管理三个维度提供了 UI 绘制能力,目前已经提供了 canvas 组件绘制能力,但功能仍在完善中。下面我们将通过两个示例展示声明式开发范式中 canvas 组件的基础使用方法。
  2.2.1 图片叠加
  如下图所示,是三张图片叠加的效果,顶层的图片覆盖了底层的图片。通过依次使用 drawImage (x,y, width, height) 方法设置图片坐标及尺寸,后面绘制的图片自动覆盖原来的图像,从而达到预期效果。
  扩展的 TS 语言采用更接近自然语义的编程方式,让开发者可以直观地描述 UI 界面,示例代码如下:@Entry@ComponentstructIndexCanvas1{privatesettings:RenderingContextSettings=newRenderingContextSettings(true);//获取绘图对象privatectx:RenderingContext=newRenderingContext(this.settings);//列出所要用到的图片privateimg:ImageBitmap=newImageBitmap("common/bg.jpg");build(){Column(){//创建canvasCanvas(this.ctx).width(1500).height(900).border({color:"blue",width:1,}).backgroundColor("#ffff00")//开始绘制.onReady(()=>{this.ctx.drawImage(this.img,400,200,540,300);this.ctx.drawImage(this.img,500,300,540,300);this.ctx.drawImage(this.img,600,400,540,300);})}.width("100%").height("100%")}}
  2.2.2 点击创建线性渐变
  如下图所示,是一个线性渐变效果。基于 canvas 扩展了一个 Button 组件,通过点击"Click"按钮,触发 onClick () 方法,并通过调用 createLinearGradient () 方法,绘制出了一个线性渐变色。
  示例代码如下:@Entry@ComponentstructGradientExample{privatesettings:RenderingContextSettings=newRenderingContextSettings(true);privatecontext:RenderingContext=newRenderingContext(this.settings);privategra:CanvasGradient=newCanvasGradient();build(){Column({space:5}){//创建一个画布Canvas(this.context).width(1500).height(900).backgroundColor("#ffff00")Column(){//设置按钮的样式Button("Click").width(250).height(100).backgroundColor("#000000").onClick(()=>{//创建一个线性渐变色vargrad=this.context.createLinearGradient(600,200,400,750)grad.addColorStop(0.0,"red");grad.addColorStop(0.5,"white");grad.addColorStop(1.0,"green");this.context.fillStyle=grad;this.context.fillRect(400,200,550,550);})}.alignItems(HorizontalAlign.center)}}}飞机大战小游戏绘制实践
  如下图所示,是一款"飞机大战"小游戏,通过控制战机的移动摧毁敌机。如何使用 ArkUI 开发框架提供的 canvas 组件轻松实现这个经典怀旧的小游戏?实现思路及关键代码如下:
  1. 首先列出游戏所用到的图片privateimgList:Array<string>=["xx.png","xx.png"…];
  2. 将图片渲染到 canvas 画布上letimg:ImageBitmap=newImageBitmap("图片路径(如common/images)/"+this.imgList[数组下标]);this.ctx.drawImage(img,150/*x坐标*/,150/*y坐标*/,600/*宽*/,600/*高*/)
  3. 绘制背景图片和战机向下移动的效果this.ctx.drawImage(this.bg,0,this.bgY);this.ctx.drawImage(this.bg,0,this.bgY-480);this.bgY++==480&&(this.bgY=0);
  4. 使用 Math.round 函数随机获取敌机图片并渲染到画布上,并且改变敌机 y 轴坐标,使它向下运动。Efight=Math.round(Math.random()*7);//前七张为敌机图片。letimg:ImageBitmap=newImageBitmap("common/img"+this.imgList[Efight]);this.ctx.drawImage(img,0,this.Eheight+50);//渲染敌机
  5. 在页面每隔 120ms 出现一排子弹,之后减小或增大(x,y)轴的坐标达到子弹射出效果。leti=0;setInterval(()=>{this.ctx.drawImage(this.bulImg1,image.x–10–(i*10),image.x+(i*10))this.ctx.drawImage(this.bulimg2,this.bulImg1,image.x–(i*10),iimage.x+(i*10))this.ctx.drawImage(this.bulimg3,image.x+10+(i*10),image.x+(i*10))i++;},120)
  6. 使用 onTouch 方法获取战机移动位置,获取拖动的坐标后重新设置战机的图片坐标,使战机实现拖动效果。.onTouch((event)=>{varoffsetX=event.localX||event.touches[0].localX;varoffsetY=event.localY||event.touches[0].localY;varw=this.heroImg[0].width,h=this.heroImg[0].height;varnx=offsetX-w/2,ny=offsetY-h/2;nx<20-w/2?nx=20-w/2:nx>(this.windowWidth-w/2-20)?nx=(this.windowWidth-w/2-20):0;ny<0?ny=0:ny>(this.windowHeight-h/2)?ny=(this.windowHeight–h/2):0;this.hero.x=nx;this.hero.y=ny;this.hero.count=2;
  注:本示例引用了部分开源资源,感兴趣的开发者可参考此开源资源,结合文中的实现思路补全代码。(https://github.com/  xs528 / game)
  以上就是本期全部内容,期待广大开发者能通过 canvas 组件绘制出精美的图形,更多 canvas 组件的详细使用方法,请参考文档进行学习:
  https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-canvas-canvas-0000000000621808

爆料荣耀手机内测华为鸿蒙HarmonyOS通过名单预计于明日公布IT之家6月29日消息荣耀部分老机型在上周开启了华为鸿蒙HarmonyOS2内测,包含荣耀V30系列荣耀30系列荣耀20系列等多款机型,想必IT之家有很多小伙伴都报了名。今日,数码荣耀首批老机型今日下午4点开启鸿蒙HarmonyOS2内测感谢IT之家网友god的线索投递!IT之家6月23日消息HarmonyOS官方此前在花粉俱乐部宣布了鸿蒙HarmonyOS2升级的新阶段时间表,荣耀部分老机型将开启内测招募升级。据华为nova3i畅享平板2荣耀9等多款设备开启鸿蒙HarmonyOS公测招募感谢IT之家网友乄弈枫灬的线索投递!IT之家11月16日消息,华为方面今日宣布,HUAWEInova3i华为畅享平板2等9款设备即日起开启公测招募!据悉,此次升级名单包括nova3华为Petal花瓣搜索新增鸿蒙HarmonyOS服务卡片感谢IT之家网友颓然芳草的线索投递!IT之家11月16日消息,据网友反馈,华为Petal搜索已经新增鸿蒙系统HarmonyOS服务卡片,并提供了针对国区的服务。不过华为Petal搜华为鸿蒙开发新增8个Sample示例支持HarmonyOS或OpenHarmony(附具体内容)感谢IT之家网友肖战割割的线索投递!IT之家11月16日消息,据华为鸿蒙官方发布,HarmonyOSSample上新,新增了8个超级实用的应用示例,其中3个是基于TS扩展的声明式开华为账号好友消息将于6月30日24时起正式停止提供服务感谢IT之家网友真南倒我了的线索投递!IT之家5月31日消息,昨日,华为发布公告称,由于产品策略调整,华为账号好友消息将自2022年6月30日24时起正式停止提供服务,停服后用户将消息称华为畅享50即将发布搭载麒麟芯片6000mAh电池IT之家5月30日消息,近日数码博主爆料称,华为将于今年6月正式发布nova10系列等。还有数码博主表示该场发布会将会包括多款产品,包括MatePad系列FreeBuds系列等等。华为WATCHGT3Pro推送鸿蒙HarmonyOS2。1。0。358更新新增手机找手表感谢IT之家网友boston9的线索投递!IT之家6月8日消息,华为WATCHGT3Pro开始推送鸿蒙HarmonyOS2。1。0。358更新,下载包大小为76。02MB。更新日志华为MateXs2P50PocketMateX2折叠屏包揽5月份中国市场销量前三,已自建超级材料实验室感谢IT之家网友络世的线索投递!IT之家6月8日消息,据中国证券网等报道,近日,华为举办折叠旗舰创新技术媒体沟通会,解密新一代折叠旗舰华为MateXs2创新技术背后的故事。得益于研华为Mate40Pro等多款手机获得鸿蒙HarmonyOS2。0。0。128更新感谢IT之家网友Coode的线索投递!IT之家6月23日消息据多位IT之家网友投稿,华为昨日向多款设备推送了HarmonyOS系统更新,涉及Mate40ProMate40RS以及M华为P30nova5Mate20X等系列开启鸿蒙HarmonyOS2。0内测招募,荣耀30V30等6月底开启IT之家6月10日消息今天下午,HarmonyOS官方在花粉俱乐部宣布了鸿蒙HarmonyOS升级的新阶段时间表。华为P30系列华为nova5系列Mate20XMateXM6等11
<<<<<<>>>>>>
消息称华为MatePad10。42022平板国行将有麒麟710A版本感谢IT之家网友软媒用户1195352的线索投递!IT之家3月11日消息,2月底,华为在海外举行春季发布会,发布了MatePad10。42022平板,最初爆料称这款平板国行将搭载高华为麒麟9000L芯片跑分出炉,近似天玑1200感谢IT之家网友BOE的周冬雨的线索投递!IT之家3月9日消息,今年2月底,华为发布了Mate40EPro5G手机,并在华为商城上架,新机支持5G全网通,搭载麒麟9000L处理器。华为鸿蒙HarmonyOS手机可检测到数据线降低充电速度,并推荐购买官方5A6AUSBTypeC线缆感谢IT之家网友YoungZhang的线索投递!IT之家12月27日消息,此前华为鸿蒙HarmonyOS2升级后,若使用了山寨充电器,手机会智能识别并提示充电缓慢此充电器未通过快充麒麟960用户狂喜华为Mate9P10系列等机型将在9月下旬开启鸿蒙HarmonyOS内测感谢IT之家网友肖战割割的线索投递!IT之家9月8日消息感谢IT之家网友热心线索投递,华为Mate9系列华为P10系列华为平板M5系列华为nova3华为畅享9Plus等机型将在9月华为畅享20荣耀20青春版Play3等机型开启鸿蒙HarmonyOS2内测招募感谢IT之家网友逍遥剑圣的线索投递!IT之家9月8日消息感谢IT之家网友热心线索投递,华为畅享205G华为畅享9S华为麦芒8华为畅享10荣耀20青春版荣耀8X荣耀10青春版荣耀20华为官方手把手教你使用鸿蒙HarmonyOS本地模拟器IT之家2月26日消息,2021年的华为开发者大会(HDC2021)上,华为随DevEcoStudio3。0Beta1版本发布首次推出了本地模拟器(也称为LocalEmulator华为智慧语音11。0。46。300开启众测支持边播报边收音,需骁龙888或麒麟990及以上芯片感谢IT之家网友海珠孤岛的线索投递!IT之家2月26日消息,昨日,华为智慧语音开启11。0。46。300版本众测,活动时间为2月25日至2月28日。IT之家了解到,新版本中,智慧助华为P50Pocket折叠屏手机搭载骁龙8884G处理器,不支持5GIT之家12月23日消息,今天下午华为正式发布了旗下首款纵向折叠手机华为P50Pocket,虽然发布会官方没有公布新机采用的高通处理器的具体型号,但IT之家了解到,新机采用骁龙88华为P50Pocket(宝盒)正式发布纵向折叠设计,后置智慧外屏,售价898810988元IT之家12月23日消息,今天下午华为举行了冬季旗舰新品发布会,发布了旗下折叠屏新机P50Pocket(中文名华为P50宝盒),这是华为首款纵向折叠屏手机。IT之家了解到,华为P5光弘科技一直是华为平板电脑产品主要供应商,代工制造中邮Hinova9手机集微网消息,12月10日,有投资者在投资者互动平台提问据IT之家消息,华为将在12月下旬推出一系列新品,其中包括墨水平板,请问贵司这款支持快充的墨水平板由贵司代工吗?光弘科技在投资华为智慧识屏11。1。17。300开启众测支持双指长按点击听歌识曲,AI截屏隐私新增姓名自动打码感谢IT之家网友Mr丶苏海珠孤岛的线索投递!IT之家3月12日消息,华为智慧识屏现已开启11。1。17。300版本众测,活动时间为3月11日至3月17日。IT之家了解到,华为智慧识