#html #html5-canvas #dart #dart-editor #dartium
#HTML #html5-холст #dart #dart-редактор #dartium
Вопрос:
Я пытаюсь сделать так, чтобы в каждой позиции, в которую перемещается моя мышь, создавался черный круг, но я не могу заставить его отображаться, я знаю, что получаю ввод, но я понятия не имею, почему мои вещи не отображаются? Есть ли какой-то метод перерисовки, который мне не хватает? Я перепробовал довольно много вещей, которые я действительно не понимаю, как requestAnimation
это будет работать здесь.
Что я делаю не так?
import 'dart:html';
import 'dart:async';
import 'package:polymer/polymer.dart';
CanvasElement canvas = document.querySelector('#myPaintCanvas');
CanvasRenderingContext2D context = canvas.getContext('2d');
//circle deminsions
var centerX;
var centerY;
var radius = 15;
var PI = 3.14;
void requestRedraw(){
window.requestAnimationFrame(scribble());
}
void scribble(pointX, pointY){
print("MouseX: " pointX.toString() " MouseY: " pointY.toString());
context.arc(pointX, pointY, radius, 0, 2 * PI, false);
context.fillStyle = 'black';
context.fill();
context.strokeStyle = '#003300';
context.stroke();
}
void main(){
canvas.onMouseDown.listen((onDown){
StreamSubscription mouseMoveStream = canvas.onMouseMove.listen((onData){
scribble(onData.client.x, onData.client.y);
});
//to end my stream when the mouse is up
canvas.onMouseUp.listen((onData) => mouseMoveStream.cancel());
});
}
Комментарии:
1. Я только что добавил это к нему, и он выдает ошибку, в которой говорится, что scribble() не может быть void , но что еще вы могли бы сделать для такого типа функции?
2.
requestAnimationFrame
принимаетRequestAnimationFrameCallback
в качестве аргумента, который является функцией, от num до voidtypedef void RequestAnimationFrameCallback(num highResTime);
, и вы пытаетесь передать результатscribble
, в которыйvoid
window.requestAnimationFrame(scribble());
вы можете его обернуть,(_)=>scribble(x,y)
тогда он будет работать.
Ответ №1:
Скорее всего, у вас проблема с масштабированием из-за несоответствия между фактическим размером рисунка холстов и его размером как элемента DOM ( canvas.width = 500;
и canvas.style.width="500px";
)
Исправлено масштабирование некоторые дополнительные исправления:
import 'dart:html';
import 'dart:async';
CanvasElement canvas = document.querySelector('#myPaintCanvas');
CanvasRenderingContext2D context;
//circle deminsions
var centerX;
var centerY;
var radius = 15;
var PI = 3.14;
void scribble(pointX, pointY) {
print("MouseX: " pointX.toString() " MouseY: " pointY.toString());
context.clearRect(0, 0, canvas.width, canvas.height);
context.beginPath();
context.arc(pointX, pointY, radius, 0, 2 * PI, false);
context.fillStyle = 'black';
context.fill();
context.strokeStyle = '#003300';
context.stroke();
context.closePath();
}
void main() {
canvas.width = 500;
canvas.style.width="500px";
canvas.height = 500;
canvas.style.height="500px";
context = canvas.getContext('2d');
canvas.onMouseDown.listen((onDown) {
StreamSubscription mouseMoveStream = canvas.onMouseMove.listen((onData) {
var rec = canvas.getBoundingClientRect();
scribble(onData.client.x- rec.left, onData.client.y - rec.top);
});
//to end my stream when the mouse is up
document.onMouseUp.listen((onData) => mouseMoveStream.cancel());
});
}
Я добавил context.clearRect
, чтобы было ясно, где находится круг. context.beginPath();
и context.closePath();
необходимы для предотвращения мостов между кругами. document.onMouseUp
вместо canvas.onMouseUp
исправления проблемы, когда кнопка мыши отпущена за пределы холста.