HarmonyOS NEXT开发实战案例--圆盘
这是之前写过的一个项目,后来删掉了,现在适配到api12重新发布,友友们按需查阅。
本文主要通过抽奖转盘小项目讲解在鸿蒙开发中如何使用画布组件Canvas绘制图形和文字,以及转圈动画的实现。效果图如下:

首先绘制转盘的六个分区:
drawInnerArc() {
let colors = [
'rgb(61,127,255)','rgb(121,189,255)'
];
let radius = this.screenWidth * 0.336;
for (let i = 0; i < 6; i++) {
if (this.canvasContext !== undefined) {
this.canvasContext.beginPath();
this.canvasContext.fillStyle = colors[i%2];
this.canvasContext.arc(0, 0, radius,
this.startAngle * Math.PI / 180, (this.startAngle + this.avgAngle) * Math.PI / 180);
this.canvasContext.fill();
}
this.canvasContext?.lineTo(0, 0);
this.canvasContext?.fill();
this.startAngle += this.avgAngle;
}
}
在界面中添加画布组件,将转盘区域绘制出来:
Canvas(this.canvasContext)
.width('100%')
.height('100%')
.onReady(() => {
this.drawModel.draw(this.canvasContext, this.screenWidth, this.screenHeight);
})

然后在转盘的分区上分别绘制文字,注意,这里的文字使用Text组件并不容易实现,因为要进行角度的调整,使每个文字都朝向圆心的位置:
let textArrays = [
"玉米","番茄","西瓜","苹果","樱桃","菠萝"
];
let arcTextStartAngle = 34;
let arcTextEndAngle = 26;
for (let i = 0; i < 6; i++) {
let startAngle = (this.startAngle + arcTextStartAngle) * Math.PI / 180
let endAngle = (this.startAngle + arcTextEndAngle) * Math.PI / 180
class CircleText {
x: number = 0;
y: number = 0;
radius: number = 0;
}
let circleText: CircleText = {
x: 0,
y: 0,
radius: this.screenWidth * 0.336
};
// The radius of the circle.
let radius = circleText.radius - circleText.radius / 6;
// The radians occupied by each letter.
let angleDecrement = (startAngle - endAngle) / (textArrays[i].length - 1);
let angle = startAngle;
let index = 0;
let character: string;
while (index < textArrays[i].length) {
character = textArrays[i].charAt(index);
this.canvasContext?.save();
this.canvasContext?.beginPath();
this.canvasContext?.translate(circleText.x + Math.cos(angle) * radius,
circleText.y - Math.sin(angle) * radius);
this.canvasContext?.rotate(Math.PI / 2 - angle);
this.canvasContext?.fillText(character, 0, 0);
angle -= angleDecrement;
index++;
this.canvasContext?.restore();
}
this.startAngle += this.avgAngle;
}

此时一个基本的转盘已经完成了,可以在转盘外增加一个大转盘作为修饰:
drawOutCircle() {
// Draw outer disc.
this.fillArc(new FillArcData(0, 0, this.screenWidth * 0.4, 0,
Math.PI * 2), 'rgb(102,177,255)');
let beginAngle = this.startAngle;
// Draw small circle.
for (let i = 0; i < 8; i++) {
this.canvasContext?.save();
this.canvasContext?.rotate(beginAngle * Math.PI / 180);
if (this.canvasContext !== undefined) {
this.canvasContext.beginPath();
this.canvasContext.fillStyle = '#FFFFFF';
this.canvasContext.arc(this.screenWidth * 0.378, 0, 4.1,
0, 360);
this.canvasContext.fill();
}
beginAngle = beginAngle + 360 / 8;
this.canvasContext?.restore();
}
}

使用叠加布局为转盘添加指针:
Stack({ alignContent: Alignment.Center }) {
Canvas(this.canvasContext)
.width('100%')
.height('100%')
.onReady(() => {
this.drawModel.draw(this.canvasContext, this.screenWidth, this.screenHeight);
})
.rotate({
x: 0,
y: 0,
z: 1,
angle: this.rotateDegree,
centerX: this.screenWidth / 2,
centerY: this.screenHeight / 2
})
Image($r('app.media.btn_start'))
.width('19.3%')
.height('10.6%')
.enabled(this.enableFlag)
}

好了,界面大功告成。接下来是动画部分,我们可以给指针添加一个点击事件,为转盘添加旋转动画:
startAnimator() {
let randomAngle = Math.round(Math.random() * 360);
animateTo({
duration: 4000,
curve: Curve.Ease,
delay: 0,
iterations: 1,
playMode: PlayMode.Normal,
onFinish: () => {
this.rotateDegree = 270 - randomAngle;
}
}, () => {
this.rotateDegree = 360 * 5 +
270 - randomAngle;
})
}
Image($r('app.media.btn_start'))
.width('19.3%')
.height('10.6%')
.enabled(this.enableFlag)
.onClick(() => {
this.enableFlag = !this.enableFlag;
this.startAnimator();
})
以上就是整个转盘的开发过程
HarmonyOS NEXT开发实战案例--圆盘的更多相关文章
- Hadoop应用开发实战案例 第2周 Web日志分析项目 张丹
课程内容 本文链接: 张丹博客 http://www.fens.me 用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/程序源代码下载 ...
- 015_[小插曲]看黄老师《炼数成金Hadoop应用开发实战案例》笔记
1.大数据金字塔结构 Data Source-->Data Warehouses/Data Marts-->data exploration-->Data Mining-->D ...
- Hadoop应用开发实战案例 第2周
比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...
- Hadoop应用开发实战案例 第1周
本课程的基础课程是,Hadoop数据分析平台课程.相信,能看我本博文的朋友,是有一定的基础了. 只是前个课程是讲解,这个课程是应用. 第一层是:数据源层,代表有生产线上的数据,比如关系型数据库orca ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 《Spring 3.x 企业应用开发实战》目录
图书信息:陈雄华 林开雄 编著 ISBN 978-7-121-15213-9 概述: 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识. 第2章:通过一个简单的例 ...
- [置顶] PHP开发实战权威指南-读书总结
从今年开始,断断续续学习PHP已经有4个月了. 最初,认真学习PHP几天,就弄WordPress搭建了一个个人博客,这也符合技术人的实践理念. 最近,重温PHP开发实战权威指南,做点总结,整理下自己学 ...
- Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)
Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...
- [原创].NET 分布式架构开发实战之二 草稿设计
原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计 前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下 ...
- AI应用开发实战 - 手写识别应用入门
AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...
随机推荐
- 你还不会使用Pycham Remote development 打开远程主机工作目录吗?这篇文章帮你解决!
前言 必备: 本地开发机与远程主机都要安装Pycharm专业版!!! 废话不多说直接开始!! 1.打开pycharm 2.依次点击File.Remote Development 3.依次点击SSH.N ...
- docker - [07] 部署ES+Kibana
思考问题:以后在Tomcat部署项目,如果每次都要进入容器会十分麻烦,是否可以在容器外部提供一个映射路径,webapps,在外部放置项目,自动同步到容器内部? 一.启动es docker run -d ...
- nodejs 使用记录
基本配置 不论是ubuntu还是windows10,对于非安装版的nodejs,在下载后所做的配置: 设置环境变量:NODE_ROOT为nodejs根目录,NODE_PATH为其中node_modul ...
- angular+ionic项目,页面无法滚动的问题
在做angular+ionic+cordova项目时,遇到一个小小的问题,就是内容做完,页面无法滚动,导致内容显示不完整 首先我检查了样式,发现并没有给页面定死高度,再次检查结构发现,我并没有用ion ...
- yolov5 train报错:TypeError: expected np.ndarray (got numpy.ndarray)
前言 mac intel 机器上,使用 yolov5 物体检测训练时报错:TypeError: expected np.ndarray (got numpy.ndarray) 这个错误信息 TypeE ...
- Django实战项目-学习任务系统-用户注册
接着上期代码框架,开发第2个功能,用户注册,在原有用户模型基础上,增加一个学生用户属性表,用来关联学生用户的各种属性值,这个属性表是参考网络小说里系统属性值设计的,方便直观了解用户的能力高低,等级以及 ...
- docker也一直发展
docker也一直发展.但本答案仅仅作为向新人介绍docker的入门文章的话,在大方向上还是没问题的.本文仅仅是个docker入门介绍文章,用比较宏大的叙事来描述docker的面貌,如果想了解更细节或 ...
- Pydantic Mixin:构建可组合的验证系统体系
title: Pydantic Mixin:构建可组合的验证系统体系 date: 2025/3/22 updated: 2025/3/22 author: cmdragon excerpt: Pyda ...
- BUUCTF---异性相吸(欠编码)
1.题目 ܟࠄቕ̐员䭜塊噓䑒̈́ɘ䘆呇Ֆ䝗䐒嵊ᐛ asadsasdasdasdasdasdasdasdasdasdqwesqf 2.知识 3.解题 很奇怪,不知道什么加密,借鉴网上参考,得知需将其转化为 ...
- 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!
大家好啊!我是小康. 今天我们来聊一个听起来枯燥但实际上暗藏玄机的话题 -- C 语言的宏定义. 啥?宏定义?那不就是个简单的替换工具吗? 兄dei,如果你也是这么想的,那可就大错特错了!宏定义在 C ...