Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
hello uni-app x
提交
e7d677d8
H
hello uni-app x
项目概览
DCloud
/
hello uni-app x
通知
6005
Star
91
Fork
164
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
18
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hello uni-app x
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
18
Issue
18
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e7d677d8
编写于
6月 05, 2024
作者:
X
xty
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加canvas ball动画页面
上级
50c10a61
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
163 addition
and
0 deletion
+163
-0
pages.json
pages.json
+7
-0
pages/component/canvas/canvas.uvue
pages/component/canvas/canvas.uvue
+156
-0
未找到文件。
pages.json
浏览文件 @
e7d677d8
...
@@ -1490,6 +1490,13 @@
...
@@ -1490,6 +1490,13 @@
{
{
"navigationBarTitleText"
:
"overflow-visible-event"
"navigationBarTitleText"
:
"overflow-visible-event"
}
}
},
{
"path"
:
"pages/component/canvas/canvas"
,
"style"
:
{
"navigationBarTitleText"
:
""
}
}
}
],
],
"globalStyle"
:
{
"globalStyle"
:
{
...
...
pages/component/canvas/canvas.uvue
0 → 100644
浏览文件 @
e7d677d8
<template>
<view class="page-body">
<canvas canvas-id="canvas" id="canvas" class="canvas"></canvas>
</view>
</template>
<script setup>
class Ball {
private canvasWidth : number
private canvasHeight : number
private ctx : CanvasRenderingContext2D
private x : number
private y : number
private vx : number
private vy : number
private radius : number = 5
constructor(x: number, y: number, vx: number, vy: number, ctx: CanvasRenderingContext2D){
this.ctx = ctx
this.canvasWidth = ctx.canvas.width
this.canvasHeight = ctx.canvas.height
this.x = x
this.y = y
this.vx = vx
this.vy = vy
}
draw() {
this.ctx.fillStyle = '#007AFF'
this.ctx.beginPath()
this.ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI)
this.ctx.closePath()
this.ctx.fill()
}
move() {
this.x += this.vx
this.y += this.vy
// 回到中心
// if (getDistance(this.x - this.canvasWidth / 2, this.y - this.canvasHeight / 2) >
// getDistance(this.canvasWidth / 2, this.canvasHeight / 2) + this.radius) {
// this.x = this.canvasWidth / 2
// this.y = this.canvasHeight / 2
// }
// 边框反弹
if (this.x < this.radius) {
this.vx = Math.abs(this.vx)
return
}
if (this.x > this.canvasWidth - this.radius) {
this.vx = -Math.abs(this.vx)
}
if (this.y < this.radius) {
this.vy = Math.abs(this.vy)
return
}
if (this.y > this.canvasWidth - this.radius) {
this.vy = -Math.abs(this.vy)
}
}
}
class BallAnimation {
private ctx : CanvasRenderingContext2D
private ballList : Array<Ball> = []
private speed = 3
private layer = 3
private ballInlayer = 20
private interval : number = 0
constructor(ctx : CanvasRenderingContext2D){
this.ctx = ctx
this.initBall()
}
private getDistance(x: number, y: number) : number{
return Math.pow((Math.pow(x, 2) + Math.pow(y, 2)), 0.5)
}
private initBall() {
let canvasWidth = this.ctx.canvas.width,
canvasHeight = this.ctx.canvas.height
for (let i = 0; i < this.layer; i++) {
let radius = getDistance(canvasWidth / 2, canvasHeight / 2) / layer * i
for (let j = 0; j < this.ballInlayer; j++) {
let deg = j * 2 * Math.PI / ballInlayer,
sin = Math.sin(deg),
cos = Math.cos(deg),
x = radius * cos + canvasWidth / 2,
y = radius * sin + canvasHeight / 2,
vx = this.speed * cos,
vy = this.speed * sin
ballList.push(new Ball(x, y, vx, vy, ctx))
}
}
}
private animate(ballList: Array<Ball>) {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height )
ballList.forEach(function(item) {
item.move()
item.draw()
})
this.ctx.draw()
}
start(){
//Todo.. requestAnimationFrame
clearInterval(this.interval)
interval = setInterval(function() {
animate(ballList)
}, 17)
}
stop(){
clearInterval(this.interval)
}
}
var animation : BallAnimation|null = null
onReady(() => {
let canvas = uni.getElementById("canvas") as UniCanvasElementImpl
let canvasContext = canvas.getContext("2d");
if(canvasContext != null) {
animation = new BallAnimation(canvasContext)
animation?.start()
} else {
console.log("canvas.getContext error!!")
}
})
onUnload(()=> {
animation?.stop()
animation = null
})
onAppShow((_ : OnShowOptions)=>{
animation?.start()
})
onAppHide(()=>{
animation?.stop()
})
</script>
<style>
.page-body-wrapper {
text-align: center;
}
.canvas {
width: 610rpx;
height: 610rpx;
margin: auto;
background-color: #fff;
}
</style>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录