这是之前写过的一个项目,后来删掉了,现在适配到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开发实战案例--圆盘的更多相关文章

  1. Hadoop应用开发实战案例 第2周 Web日志分析项目 张丹

    课程内容 本文链接: 张丹博客 http://www.fens.me 用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/程序源代码下载 ...

  2. 015_[小插曲]看黄老师《炼数成金Hadoop应用开发实战案例》笔记

    1.大数据金字塔结构 Data Source-->Data Warehouses/Data Marts-->data exploration-->Data Mining-->D ...

  3. Hadoop应用开发实战案例 第2周

    比如,封面,是一网页,可以看出用户在此网页上,鼠标呈现F形状. 海量Web日志分析 用Hadoop提取KPI统计指标 更详细原文博客:http://blog.fens.me/hadoop-mapred ...

  4. Hadoop应用开发实战案例 第1周

    本课程的基础课程是,Hadoop数据分析平台课程.相信,能看我本博文的朋友,是有一定的基础了. 只是前个课程是讲解,这个课程是应用. 第一层是:数据源层,代表有生产线上的数据,比如关系型数据库orca ...

  5. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  6. 《Spring 3.x 企业应用开发实战》目录

    图书信息:陈雄华 林开雄 编著 ISBN 978-7-121-15213-9 概述: 第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识. 第2章:通过一个简单的例 ...

  7. [置顶] PHP开发实战权威指南-读书总结

    从今年开始,断断续续学习PHP已经有4个月了. 最初,认真学习PHP几天,就弄WordPress搭建了一个个人博客,这也符合技术人的实践理念. 最近,重温PHP开发实战权威指南,做点总结,整理下自己学 ...

  8. Hadoop应用开发实战(flume应用开发、搜索引擎算法、Pipes、集群、PageRank算法)

    Hadoop是2013年最热门的技术之一,通过北风网robby老师<深入浅出Hadoop实战开发>.<Hadoop应用开发实战>两套课程的学习,普通Java开发人员可以在最快的 ...

  9. [原创].NET 分布式架构开发实战之二 草稿设计

    原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计 前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下 ...

  10. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

随机推荐

  1. 天线驻波比&回波损耗

    天线驻波比(VSWR)‌,全称为电压驻波比,是衡量天线系统匹配程度的重要参数.它定义为驻波波腹处的电压幅值与波谷处的电压幅值之比.理想情况下,当馈线和天线的阻抗完全匹配时,驻波比为1,表示高频能量全部 ...

  2. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this

    mysql操作错误: mysql> use mysql;ERROR 1820 (HY000): You must reset your password using ALTER USER sta ...

  3. Scala变量补充

    package com.wyh.day01 object ScalaLanguage { def main(args: Array[String]): Unit = { /** * 定义变量和常量 * ...

  4. Python基础笔记-while、字符串格式化、运算符、基础概念与数据类型

    前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...

  5. NCS开发学习笔记-基础篇-第 1 课 – 安装 nRF Connect SDK 开发环境

    练习1 -安装 nRF Connect SDK 开发环境 需要安装的软件 Git python J-Link nrfutil nRF Command Line Tools VScode Chinese ...

  6. Open-Sora 2.0 重磅开源!

    潞晨科技正式推出 Open-Sora 2.0 -- 一款全新开源的 SOTA 视频生成模型,仅 20 万美元(224 张 GPU)成功训练商业级 11B 参数视频生成大模型.开发高性能的视频生成模型通 ...

  7. vue学习一(指令3.v-on,v-for)

    3.1.v-on 绑定事件  可以简写为@ ,按键修饰符    v-on:keyup    =    @keyup 事件修饰符:v-on提供了事件修饰符 修饰符是由点开头的指令后缀来表示的       ...

  8. netstat 与 ss 比较

    一.netstat 命令 1. 核心功能 显示网络连接.路由表.接口统计等信息. 支持TCP.UDP.UNIX域套接字等协议. 可查看进程与端口的关联. 2. 常用语法示例 查看所有活动连接 nets ...

  9. CoreOS 发行版本介绍

    大多数的软件通常都有什么内测版.公测版什么的. CoreOS 发行版本 而在 CoreOS 中, 有以下3个版本: alpha - α版,音译:阿尔法,俗称尝鲜版,是最新的版本,但是容易出现bug,最 ...

  10. 征婚 SQL

    [男]程序员是这么征婚滴 SELECT * FROM 女人们  WHERE 未婚=true  AND Gay=false AND 处女=true AND 有魅力 =true AND 条件 IN (漂亮 ...