- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个 html Canvas 垫,它允许用户在垫上拖放一个点,然后返回两个值(一个用于 Y 轴,一个用于 Y 轴),我可以用于使用网络音频 API 触发效果。
我已经解决了问题的网络音频 API 部分。
用户:
湿/干
delay_time
到目前为止,我已经能够创建和渲染 Canvas 和圆圈,并在 svg 元素和窗口上添加事件监听器。我的想法是,我可以检测 Canvas 内何时发生事件以及该单击事件何时离开 Canvas 。
// Draw SVG pad
function drawDelayPad() {
var canvas = document.getElementById('delayPad');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
var rectangle = new Path2D();
rectangle.rect(1, 1, 200, 200);
var circle = new Path2D();
circle.moveTo(150, 150);
circle.arc(100, 35, 10, 0 , 2 * Math.PI);
ctx.stroke(rectangle);
ctx.fill(circle);
}
}
// Listener on canvas
var canvas = document.getElementById('delayPad');
canvas.addEventListener("mousedown", function(){
console.log("click inside our canvas")
})
// Listener on document to check if we're outside the canvas
window.addEventListener("mouseup", function(){
console.log("outside our canvas")
});
所以我认为我现在需要确定的是,当 Canvas 内部发生点击事件时,它距离圆有多远,如果它确实落在圆的边界内,我应该将其重绘为只要 mousedown 事件处于事件状态。
任何帮助将不胜感激。
最佳答案
我找到了一个不错的小解决方案,这证实了我对点击计数器的怀疑!所有功劳确实归于 rectangleWorld因为我在很大程度上只能修改他们提供的示例。
// Draw SVG pad
function canvasApp(canvasID) {
var theCanvas = document.getElementById(canvasID);
var context = theCanvas.getContext("2d");
init();
var numShapes;
var shapes;
var dragIndex;
var dragging;
var mouseX;
var mouseY;
var dragHoldX;
var dragHoldY;
function init() {
numShapes = 1;
shapes = [];
makeShapes();
drawScreen();
theCanvas.addEventListener("mousedown", mouseDownListener, false);
}
function makeShapes() {
var i;
var tempX;
var tempY;
var tempRad;
var tempR;
var tempG;
var tempB;
var tempColor;
var tempShape;
for (i = 0; i < numShapes; i++) {
// My canvas element is 240x240
tempRad = 10;
tempX = 0 + tempRad;
tempY = 240 - tempRad;
tempR = Math.floor(Math.random() * 255);
tempG = Math.floor(Math.random() * 255);
tempB = Math.floor(Math.random() * 255);
tempColor = "rgb(" + tempR + "," + tempG + "," + tempB + ")";
tempShape = {
x: tempX,
y: tempY,
rad: tempRad,
color: tempColor
};
shapes.push(tempShape);
}
}
function mouseDownListener(evt) {
var i;
//We are going to pay attention to the layering order of the objects so that if a mouse down occurs over more than object,
//only the topmost one will be dragged.
var highestIndex = -1;
//getting mouse position correctly, being mindful of resizing that may have occured in the browser:
var bRect = theCanvas.getBoundingClientRect();
mouseX = (evt.clientX - bRect.left) * (theCanvas.width / bRect.width);
mouseY = (evt.clientY - bRect.top) * (theCanvas.height / bRect.height);
//find which shape was clicked
for (i = 0; i < numShapes; i++) {
if (hitTest(shapes[i], mouseX, mouseY)) {
dragging = true;
if (i > highestIndex) {
//We will pay attention to the point on the object where the mouse is "holding" the object:
dragHoldX = mouseX - shapes[i].x;
dragHoldY = mouseY - shapes[i].y;
highestIndex = i;
dragIndex = i;
}
}
}
if (dragging) {
window.addEventListener("mousemove", mouseMoveListener, false);
}
theCanvas.removeEventListener("mousedown", mouseDownListener, false);
window.addEventListener("mouseup", mouseUpListener, false);
//code below prevents the mouse down from having an effect on the main browser window:
if (evt.preventDefault) {
evt.preventDefault();
} //standard
else if (evt.returnValue) {
evt.returnValue = false;
} //older IE
return false;
}
function mouseUpListener(evt) {
theCanvas.addEventListener("mousedown", mouseDownListener, false);
window.removeEventListener("mouseup", mouseUpListener, false);
if (dragging) {
dragging = false;
window.removeEventListener("mousemove", mouseMoveListener, false);
}
}
function mouseMoveListener(evt) {
var posX;
var posY;
var shapeRad = shapes[dragIndex].rad;
var minX = shapeRad;
var maxX = theCanvas.width - shapeRad;
var minY = shapeRad;
var maxY = theCanvas.height - shapeRad;
//getting mouse position correctly
var bRect = theCanvas.getBoundingClientRect();
mouseX = (evt.clientX - bRect.left) * (theCanvas.width / bRect.width);
mouseY = (evt.clientY - bRect.top) * (theCanvas.height / bRect.height);
// Divide by width of canvas and multiply to get percentage out of 100
var DelayTime = ((mouseX / 240) * 100);
// Invert returned value to get percentage out of 100
var DelayFeedback = (100 - (mouseY / 240) * 100);
// Set delay time as a portion of 2seconds
delayEffect.delayTime.value = DelayTime / 100 * 2.0;
// set delay feedback gain as value of random number
delayFeedback.gain.value = (DelayFeedback / 100 * 1.0);
//clamp x and y positions to prevent object from dragging outside of canvas
posX = mouseX - dragHoldX;
posX = (posX < minX) ? minX : ((posX > maxX) ? maxX : posX);
posY = mouseY - dragHoldY;
posY = (posY < minY) ? minY : ((posY > maxY) ? maxY : posY);
shapes[dragIndex].x = posX;
shapes[dragIndex].y = posY;
drawScreen();
}
function hitTest(shape, mx, my) {
var dx;
var dy;
dx = mx - shape.x;
dy = my - shape.y;
//a "hit" will be registered if the distance away from the center is less than the radius of the circular object
return (dx * dx + dy * dy < shape.rad * shape.rad);
}
function drawShapes() {
var i;
for (i = 0; i < numShapes; i++) {
context.fillStyle = shapes[i].color;
context.beginPath();
context.arc(shapes[i].x, shapes[i].y, shapes[i].rad, 0, 2 * Math.PI, false);
context.closePath();
context.fill();
}
}
function drawScreen() {
context.fillStyle = "#000000";
context.fillRect(0, 0, theCanvas.width, theCanvas.height);
drawShapes();
}
}
window.addEventListener("load", windowLoadHandler, false);
function windowLoadHandler() {
canvasApp('delayPad');
}
还有一些缺点,例如 mouseMoveListener,虽然限制了圆的移动,但会继续增加你的 x 和 y 值。这意味着您必须使用现有的监听器来检查拖动事件何时退出圆圈,或者更简单地,您可以设置 X 和 Y 值的上限。
关于javascript - 使用 Canvas 作为多个范围输入的垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43948602/
我有一个 mat-select 元素,其中包含固定数量的 mat-option 元素。要查看最后一个元素,我必须滚动列表。是否可以扩大区域以便我无需滚动即可看到最后一个元素?
我想填充一些百分比值,以便小数位前始终有 3 个单位。使用整数我可以使用 '%03d' - 是否有等效的 float ? '%.3f' 适用于小数点后,但 '%03f' 什么都不做。 最佳答案 '%0
我有一个 vector Mat 文件,我想将它存储在 txt 文件中。每个 mat 文件的大小为 1x4500,我总共有 5000 个 vector 。我试图用上面的代码存储在 txtfile 中:
我需要一个 Mat 对象,其中每个元素都是一个类型为 double 且大小为 15 的 vector 。 我试过了 Mat seq(rownum,colnum,Vec); 但这给了我错误: expec
我想将我的 OpenCV Mat 转换为 Matlab .mat 文件,Matlab 可以轻松读取该文件。我不想使用Mex函数直接将数据提供给matlab,因为我想将数据保存在硬盘上。 有可用的 cv
我正在使用 当条件为真时,我希望有一些具有粗体样式的选项。 目前,下拉选项中的选项为粗体,但一旦选择该选项,该样式将不会应用于文本字段中的选择。 如何在选择后将样式应用于文本字段? 这是一个代码示例:
我在手机上运行我的应用程序,同时使用 MAT 进行调试。在我尝试在 Eclipse 中转储 HPROF 文件后,出现错误: 无法将 hprof 数据保存到临时文件中。设备上没有剩余空间。 我已经对此进
我有一个 CV_32F 类型的垫子 A 和一个二进制值为 0 和 255 的掩码 M。例如, A = [0.1 0.2; 0.3 0.4] M = [1 0 ; 0 0 ] 我想得到 A
我在我的 Angular 5 应用程序中使用@angular/material。我使用的 Angular Material 版本是 5.0.2。我正在使用@angular/animations 5.1
我想根据任意数据类型、行维度、列维度和 channel 维度的一维数据数组构建一个 3 channel 矩阵。在我的示例中,我有一个 1x12 double 组数据,我想将其转换为 2x2x3 Ope
我正在尝试使用 C# 中的 BouncycaSTLe 解密河豚加密字符串。 我能够轻松地加密和解密我自己的字符串,但不幸的是,我必须解密由另一个系统生成的字符串。 我能够使用以下命令使用 C#/Bou
我想在 Android Opencv c++ 库中获取绝对矩阵。我正在使用 abs(Mat m) 函数,但它会返回 MatExpr 对象。你知道如何只用矩阵的绝对值得到 Mat 对象吗? Ma
在 OpenCV 中,我可以将 RGB 1920 x 1080 垫乘以 3 x 3 垫以更改源垫的颜色组成。一旦我的源垫形状正确,我就可以使用“*”运算符来执行乘法。使用 cv::gpu::GpuMa
给定vector > A_STL , 我希望它被转换成 arma::mat A . 最佳答案 一种简单的方法是将 vector 矩阵的 vector 展平为一维 vector 。因此,您可以使用 ma
以下代码从文件中读取图像到 cv::Mat目的。 #include #include cv::Mat load_image(std::string img_path) { cv::Mat im
我有一个 AVCaptureSession,它输出带有 BGRA 像素的 CMSampleBuffer。我正在尝试仅从 BGR 创建 Mat 对象,以最有效的方式,使用数据 pointers。 CV
我正在尝试诊断我的 Android 应用程序中的内存问题。我转储了一个 HPROF 文件并将其加载到 Eclipse MAT 工具中(参见 How to analyze memory using an
我是一名优秀的程序员,十分优秀!