Следующий код пытается нарисовать изображение из кнопки, выбранной на панели инструментов, на холст в позиции мыши. На основе напечатанных координат позиция рассчитывается правильно, однако изображения размещаются не в том месте. Код:
import 'dart:html';
class Test {
ImageElement toolbar_selected_element = null;
CanvasElement canvas;
num mouseX = null, mouseY = null;
void main() {
canvas = query("#canvas");
canvas.onClick.listen(canvas_OnClick);
for (var toolbutton in queryAll('.toolbutton')) {
toolbutton.onClick.listen((e) => toolbar_selected_element = query("#${e.target.id}"));
}
}
void canvas_OnClick(MouseEvent event) {
num x,y;
var clientBoundingRect = canvas.getBoundingClientRect();
mouseX = event.clientX - clientBoundingRect.left;
mouseY = event.clientY - clientBoundingRect.top;
window.requestAnimationFrame(draw);
}
void draw(num _) {
CanvasRenderingContext2D context = canvas.context2d;
context.clearRect(0, 0, canvas.width, canvas.height);
if(toolbar_selected_element!= null && mouseX != null && mouseY != null) {
print("$mouseX $mouseY");
context.drawImage(toolbar_selected_element, mouseX, mouseY);
}
}
}
void main() {
new Test().main();
}
Соответствующий html-файл можно найти по адресу: https://github.com/joaompinto/SVGDropper/blob/master/web /svgdropper.html
1 ответ
Проблема в том, что вы устанавливаете стиль CSS width
и height
на что-то иное, чем фактическую ширину и высоту холста. Дополнительные сведения см. В этом ответе.
Если вы действительно хотите, чтобы канонический источник размеров холста находился в файле CSS, вы можете сделать что-то вроде этого:
void main() {
canvas = query("#canvas");
canvas.width = int.parse(canvas.getComputedStyle().width.split('px')[0]);
canvas.height = int.parse(canvas.getComputedStyle().height.split('px')[0]);
Я надеюсь, что есть более элегантный способ убрать пиксель, но это первое, что пришло в голову.
Похожие вопросы
Связанные вопросы
Новые вопросы
canvas
Холст - это общий термин для обозначения поверхности рисования, используемый во многих API для вывода графики в свободной форме. Используйте этот тег с другими тегами, которые указывают конкретный графический API, который используется вместе с языком программирования и целевой средой: [android], [uwp], [wpf], [tkinter], [java], [html5], [chart.js] и т. д. Также при необходимости включите специальный тег canvas, например [android-canvas], [html5-canvas], [tkinter-canvas].