- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 React-Konva 库实现一个操纵杆,该操纵杆可用于控制 React.JS 中的机器人之类的东西。到目前为止,我已经设法通过在较大的圆圈内绘制一个较小的圆圈并让较小的圆圈在鼠标按下时跟踪鼠标相对于舞台的位置来获得某种效果。它的问题在于,一旦鼠标离开舞台,我就会停止获取 onMouseMove 事件,并且圆圈一直停留在最后一个位置,直到鼠标返回舞台。理想情况下,我希望即使在舞台外移动时,圆圈也能继续跟踪鼠标的方向,但显然限制了圆圈从原点实际移动多远以保持在舞台内。
这是我到目前为止的代码
import React, { useState, useContext } from "react";
import { Stage, Layer, Circle } from "react-konva";
export default function Joystick(props) {
const { size } = props;
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const [down, setDown] = useState(false);
const joyX = down ? x : size / 2;
const joyY = down ? y : size / 2;
return (
<Stage
width={size}
height={size}
onMouseMove={(ev) => {
setX(ev.evt.layerX);
setY(ev.evt.layerY);
}}
onMouseDown={(ev) => setDown(true)}
onMouseUp={(ev) => setDown(false)}
>
<Layer>
<Circle x={size / 2} y={size / 2} radius={size / 2} fill="black" />
<Circle x={joyX} y={joyY} radius={size / 4} fill="white" />
</Layer>
</Stage>
);
}
所以我想知道的是,即使鼠标超出舞台,我也可以扩展它以保持跟踪鼠标的最简单和最干净的方法是什么?
最佳答案
根据@VanquishedWombat 的建议,从 fire the div mousemove while on document 中获取灵感我想出了以下代码
function offset(el) {
var rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return {
top: rect.top + scrollTop,
left: rect.left + scrollLeft,
};
}
export default class Joystick extends React.Component {
constructor(props) {
super(props);
this.state = {
down: 0,
x: 0,
y: 0,
offset: { top: 0, left: 0 },
};
this.handleMouseMove = this.handleMouseMove.bind(this);
this.handleMouseUp = this.handleMouseUp.bind(this);
}
updatePosition(ev, o) {
const { size } = this.props;
const offset = o || this.state.offset;
let x = ev.clientX - offset.left;
let y = ev.clientY - offset.top;
let right = (x / size - 0.5) * 2;
let up = (y / size - 0.5) * -2;
const mag = Math.sqrt(right * right + up * up);
const newMag = Math.min(mag, 1);
right = (right / mag) * newMag;
up = (up / mag) * newMag;
x = (1 + right) * (size / 2);
y = (1 - up) * (size / 2);
this.setState({ x, y });
}
handleMouseMove(ev) {
this.updatePosition(ev);
}
handleMouseUp(ev) {
document.removeEventListener("mousemove", this.handleMouseMove);
document.removeEventListener("mouseup", this.handleMouseUp);
this.setState({ down: false });
}
render() {
const { x, y, down } = this.state;
const { size } = this.props;
const joyX = down ? x : size / 2;
const joyY = down ? y : size / 2;
return (
<div
onMouseDown={(ev) => {
const o = offset(ev.currentTarget);
this.setState({ offset: o, down: true });
this.updatePosition(ev, o);
document.addEventListener("mousemove", this.handleMouseMove);
document.addEventListener("mouseup", this.handleMouseUp);
}}
style={{ width: size, height: size }}
>
<Stage width={size} height={size}>
<Layer
clipFunc={(ctx) =>
ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2)
}
>
<Circle x={size / 2} y={size / 2} radius={size / 2} fill="black" />
<Circle x={joyX} y={joyY} radius={size / 4} fill="white" />
</Layer>
</Stage>
</div>
);
}
}
这段代码有点讨厌,因为它必须计算光标相对于舞台的位置,但我试图让它尽可能简单,而且它似乎工作得很好。舞台需要包裹在一个相同大小的 div 中,以便能够使用 getBoundingClientRect 函数来计算鼠标的相对位置。我还必须将我的 React 组件从函数组件更改为类组件,因为我需要常量回调函数引用,以便在释放鼠标后可以正确地取消注册。
关于javascript - Konva 继续在舞台外跟踪鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159928/
我正在尝试通过一个名为react-konva的包来学习如何在react中使用 Canvas 。 npm 安装非常简单,我添加了一些可以运行的演示代码... // in MainComponent.js
我在我的项目中使用 Konva.js,我特别需要在使用 Konva.Rect() 类定义的可拖动矩形内定义文本。有没有一种方法可以在不使用单独的 Konva.Text 的情况下实现这一点() 或 Ko
以下是来自 Konvajs 的示例加载图像的库: var imageObj = new Image(); imageObj.onload = function() { var yoda = new
我正在努力处理一个小项目,我想在其中添加不同的插槽并保存在数据库中。 一切都按预期正常工作,我将 json 保存在数据库中并在编辑页面上再次调用。 Problem is the rectangles
安装和导入 Konva 和 react-konva 后,我的 jest@enzyme 测试无法运行并出现以下错误: ● 测试套件无法运行 Jest encountered an unexpected
如何序列化和反序列化自定义 Konva Shape? Konva 允许您使用sceneFunc 创建自定义形状,但是当您将其存储为JSON 并加载回来时,您怎么知道它是什么自定义形状? 最佳答案 要定
我正在尝试使用 React-Konva 库实现一个操纵杆,该操纵杆可用于控制 React.JS 中的机器人之类的东西。到目前为止,我已经设法通过在较大的圆圈内绘制一个较小的圆圈并让较小的圆圈在鼠标按下
这个问题是针对命运之轮的例子的。作为 javascript 的新手,我已经设法更改了楔形的数量、它们的颜色和标签,但我无法弄清楚将函数绑定(bind)到旋转动画的结束事件。这将是一个关于冒险行为的小型
我正在使用 Konva 在网页上创建一个区域。我为我的矩形创建一个 DragBoundFunc 函数,检查 pos.x 和 pos.y 以及 Canvas 和矩形的宽度,这工作正常 - 矩形仅在拖动时
我正在使用 Vue.js 的 Konva 包装器开发类似于甘特图的东西。我基本上有一个包含矩形的组(以及在这种情况下不相关的一些其他元素)。该组是可拖动的,如果该组在拖动时与另一个组重叠,我想更改矩形
我有一个网络,我想用 Konva (以及 React-konva 绑定(bind))绘制。当位置更新时,我希望将网络中的节点设置为新位置的动画,同时设置连接它们的链接的开始和结束位置的动画。 我从以下
我试图清除每个圆圈和线条的图层(将其完全删除),但将图像保留在背景中。 如果我使用layer.clear(),它也会删除图像。 问题:如何清除图层但避免删除图像? https://codesandbo
我在 Konva 中有两个可拖动的矩形,取自 tutorial . 我的目标是让红色(不可拖动)矩形始终位于蓝色可拖动矩形的平均位置。 我尝试从教程代码中更改它: box1.on('mouseover
我正在尝试为我的道路绘制一 strip 有 2 条线的分隔符。我已经尝试过只用 2 条平行线来制作它,但是当我制作我的道路曲线时,它看起来不太好。像这样: 小曲线: 大曲线: 因为它现在我只是在黑色背
我在形状层之上有一个透明的拖动层。非常适合使交互与众不同,因此我可以切换拖动的功能(在 ScrollView 或编辑形状位置之间)。但是,除非我关闭拖动模式(通过隐藏介入的透明 Rect),否则其他鼠
我有一个简单的 Konva 设置,包括图层、矩形和文本。 Canvas 随着窗口大小的调整而缩放。我的目标是在拖动时将文本包含在 Canvas 中。目前,它适用于左边界和上边界,但不适用于下边界和右边
我正在尝试使用 React 和 konva 构建一个图像裁剪工具。我想更改裁剪矩形外的不透明度以模糊图像的其余部分。 到目前为止,我已经尝试为矩形和图像设置不同的不透明度,但失败了。我查了一下,没有直
我正在尝试开始使用 konva、react-konva 构建 React 应用程序。 我构建了一个基本的 React 组件: import React, { Component } from "rea
我想拖动 Konva 图层,即使它是空的。我发现我只能拖动对象所在的图层(代码显示您可以拖动矩形所在的位置,但不能拖动其他位置)。 如何拖动图层拖动空部分? 此外,我发现如果您不在图层的对象之外,则
我正在尝试制作一个应用程序,您可以在其中绘制自定义矩形形状对象,并能够同时拖动舞台。 Konva.js 可以吗? var stage = new Konva.Stage({ container
我是一名优秀的程序员,十分优秀!