【鸿蒙实战开发】画布组件开发-Canvas对象

Canvas组件提供画布,用于自定义绘制图形。具体用法请参考CanvasRenderingContext2D对象。

创建Canvas组件

在pages/index目录下的hml文件中创建一个Canvas组件。

<!-- xxx.hml -->
<div class="container">
  <canvas></canvas>
</div>
/* xxx.css */
.container{
  width: 100%;
  height: 100%;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background-color: #F1F3F5;
}
canvas{
  background-color: #00ff73;
}

image.png

说明

  • Canvas组件默认背景色与父组件的背景色一致。

  • Canvas默认宽高为width: 300px,height: 150px。

添加样式

Canvas组件设置宽(width)、高(height)、背景色(background-color)及边框样式(border)。

<!-- xxx.hml -->
<div class="container">
  <canvas></canvas>
</div>
/* xxx.css */
.container{
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background-color: #F1F3F5;
  width: 100%;
  height: 100%;
}
canvas{
  width: 500px;
  height: 500px;  
  background-color: #fdfdfd;  
  border: 5px solid red;
}

image.png

添加事件

Canvas添加长按事件,长按后可获取Canvas组件的dataUrl值(toDataURL方法返回的图片信息),打印在下方文本区域内。

<!-- xxx.hml -->
<div class="container">
  <canvas ref="canvas1" onlongpress="getUrl"></canvas>
  <text>dataURL</text>
  <text class="content">{{dataURL}}</text>
</div>
/* xxx.css */
.container{
  width:100%;
  height:100%;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background-color: #F1F3F5;
  }
  canvas{  
    width: 500px;  
    height: 500px;
    background-color: #fdfdfd;
    border: 5px solid red;
    margin-bottom: 50px;
}
.content{
  border: 5px solid blue;
  padding: 10px;
  width: 90%;
  height: 400px; 
  overflow: scroll;
}
// xxx.js
import promptAction from '@ohos.promptAction';
export default {
  data:{
    dataURL:null,
  },
  onShow(){
    let el = this.$refs.canvas1;
    let ctx = el.getContext("2d"); 
    ctx.strokeRect(100,100,300,300);
  },
  getUrl(){
    let el = this.$refs.canvas1
    let dataUrl = el.toDataURL()
    this.dataURL = dataUrl;
    promptAction.showToast({duration:2000,message:"long press,get dataURL"})
  }
}

0000000000011111111.20240813092140.89686714715390230028089031016271.gif

说明

画布不支持在onInit和onReady中进行创建。

写在最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。

希望这一份鸿蒙学习文档能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料

请点击→纯血版全套鸿蒙HarmonyOS学习文档

鸿蒙(HarmonyOS NEXT)5.0最新学习路线

在这里插入图片描述

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习文档

《鸿蒙 (HarmonyOS)开发入门教学视频》

在这里插入图片描述

《鸿蒙生态应用开发V3.0白皮书》

在这里插入图片描述

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

在这里插入图片描述

《鸿蒙开发基础》

●ArkTS语言
●安装DevEco Studio
●运用你的第一个ArkTS应用
●ArkUI声明式UI开发
.……
在这里插入图片描述

《鸿蒙开发进阶》

●Stage模型入门
●网络管理
●数据管理
●电话服务
●分布式应用开发
●通知与窗口管理
●多媒体技术
●安全技能
●任务管理
●WebGL
●国际化开发
●应用测试
●DFX面向未来设计
●鸿蒙系统移植和裁剪定制
……
在这里插入图片描述

《鸿蒙进阶实战》

●ArkTS实践
●UIAbility应用
●网络案例
……
在这里插入图片描述

获取以上完整鸿蒙HarmonyOS学习文档,请点击→纯血版全套鸿蒙HarmonyOS学习文档

### 鸿蒙应用开发实战:抽奖功能实现 #### Canvas 组件绘制抽奖圆盘 为了创建一个视觉吸引人的抽奖界面,开发者通常会选择使用 `Canvas` 组件来绘制圆形转盘。通过设置不同的颜色和图案分区,可以模拟真实的旋转轮盘效果[^1]。 ```xml <canvas id="lotteryWheel" width="300px" height="300px"></canvas> ``` 在 JavaScript 文件中初始化并配置画布: ```javascript import { canvas } from '@ohos/arkui'; export default { onInit() { this.canvasContext = new canvas.CanvasRenderingContext2D('lotteryWheel'); this.drawLotteryWheel(); }, drawLotteryWheel() { const ctx = this.canvasContext; // 设置中心点坐标 let centerX = 150, centerY = 150; // 定义扇区数量及角度计算 let sectorsCount = 8; let anglePerSector = (Math.PI * 2) / sectorsCount; for(let i=0;i<sectorsCount;i++){ ctx.beginPath(); ctx.moveTo(centerX,centerY); // 计算当前扇区起始位置 let startAngle = i*anglePerSector; let endAngle = (i+1)*anglePerSector; ctx.arc(centerX, centerY, 140, startAngle,endAngle); // 填充不同颜色区分各个区域 ctx.fillStyle = ['#FFB6C1','#ADD8E6'][i%2]; ctx.fill(); ctx.closePath(); } } } ``` #### 显式动画启动抽奖逻辑 当用户触发抽奖事件时,可以通过调用显式的动画方法让转盘快速转动几圈后再慢慢停下指向某个特定奖项的位置。这里采用的是基于时间函数控制速度变化的方式。 ```css @keyframes spin-wheel{ from{transform:rotate(0deg);} to{transform:rotate(var(--final-angle));} /*最终停止的角度*/ } .lottery-spinning{ animation-name:spin-wheel; animation-duration:.7s; animation-timing-function:cubic-bezier(.9,.1,.2,1);/*先加速再减速*/ transform-origin:center center; } ``` JavaScript 控制类名切换以激活 CSS 动画: ```javascript startSpin(){ // ...省略获取随机数算法... document.getElementById('lotteryWheel').classList.add('lottery-spinning'); setTimeout(() => { document.getElementById('lotteryWheel').style.setProperty('--final-angle', `${randomFinalDegree}deg`); document.getElementById('lotteryWheel').addEventListener('animationend', () => { alert(`恭喜获得${prizeName}`); }, false); }); } ``` #### 自定义弹窗显示获奖信息 一旦确定了具体的奖励项,则可通过自定义对话框的形式向玩家展示所赢得的内容。这种方式既直观又友好,能够增强用户体验感。 ```html <div class="popup-mask"> <div class="popup-content"> <h2>恭喜您获得了</h2> <p>{{ prizeDetail }}</p> <button @click="closePopup">确认领取</button> </div> </div> ``` 配合相应的样式调整遮罩层透明度以及居中定位等细节处理即可完成整个交互流程的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值