如何在不降低性能的情况下重绘EaselJS圆形扇区?
我来帮你搞定这个需求!结合你给出的代码片段,我会完整实现按下空格键时,时钟阴影轨迹跟随时钟指针移动且逐帧重绘的功能,下面是具体的实现逻辑和完整代码:
完整实现代码
var stage, cont, arrow, cursorWedge, spacebarState, cursorWedgeStart, fired; var msg = document.getElementById('state-msg'); var KEYCODE_SPACEBAR = 32; spacebarState = false; fired = false; // 初始化舞台 stage = new createjs.Stage("canvas"); cont = stage.addChild(new createjs.Container()); cont.x = stage.canvas.width / 2; cont.y = 250; cont.rotation -= 90; // 把0度调整到顶部(时钟的12点方向) // 1. 绘制时钟表盘 var circle = new createjs.Shape(); circle.graphics.beginStroke("#333").setStrokeStyle(3).drawCircle(0, 0, 150); cont.addChild(circle); // 2. 绘制时钟指针 arrow = new createjs.Shape(); arrow.graphics.beginFill("#ff0000").moveTo(0,0).lineTo(120,0).lineTo(110, -10).lineTo(-10,0).closePath(); cont.addChild(arrow); // 3. 绘制阴影轨迹(cursorWedge) cursorWedge = new createjs.Shape(); cursorWedge.graphics.beginFill("rgba(0,0,0,0.2)"); // 半透明灰色作为阴影 cursorWedgeStart = 0; // 阴影起始角度,默认和指针初始角度一致 cont.addChild(cursorWedge); // 监听键盘事件:处理空格键按下/抬起 document.addEventListener("keydown", function(e) { if (e.keyCode === KEYCODE_SPACEBAR) { spacebarState = true; msg.textContent = "空格键已按下,阴影开始跟随指针"; // 记录当前指针角度作为阴影起始角度 cursorWedgeStart = arrow.rotation; } }); document.addEventListener("keyup", function(e) { if (e.keyCode === KEYCODE_SPACEBAR) { spacebarState = false; msg.textContent = "空格键已松开,阴影停止跟随"; } }); // 模拟时钟指针旋转(你可以替换成真实的时间逻辑) createjs.Ticker.framerate = 30; createjs.Ticker.addEventListener("tick", function(event) { // 让指针持续旋转(每秒6度,对应每分钟一圈) arrow.rotation += 6 / createjs.Ticker.framerate; // 当空格键按下时,更新阴影轨迹 if (spacebarState) { // 重绘阴影扇形:从起始角度到当前指针角度 cursorWedge.graphics.clear().beginFill("rgba(0,0,0,0.2)") .moveTo(0,0) .arc(0,0,150, cursorWedgeStart * Math.PI/180, arrow.rotation * Math.PI/180) .closePath(); // 如果需要阴影是"轨迹"效果(比如保留走过的路径),可以去掉clear(),但要注意性能 // 不过你的需求是每一帧重绘,所以这里每次clear后重新绘制当前的阴影范围 } stage.update(event); });
关键逻辑说明
- 键盘状态控制:通过
keydown和keyup事件监听空格键,更新spacebarState变量,用来开关阴影跟随功能。 - 逐帧重绘机制:利用CreateJS的
Ticker事件,每帧更新指针角度,同时在空格键按下时,重新绘制cursorWedge的扇形范围,让它跟住指针的当前角度。 - 阴影轨迹绘制:使用
arc方法绘制扇形阴影,通过cursorWedgeStart记录按下空格键时的指针角度,然后每帧绘制从起始角度到当前指针角度的扇形,实现跟随效果。 - 舞台更新:每帧调用
stage.update()确保画布重绘,让阴影的变化实时显示。
如果你需要调整阴影的样式(比如颜色、透明度、半径),只需要修改cursorWedge.graphics里的填充参数和arc的半径值就可以啦!
内容的提问来源于stack exchange,提问作者Matt B
相关产品推荐
相关产品推荐

