2

マウスが移動する各位置で黒い円が生成されるようにしようとしていますが、表示されません。入力を受け取っていることはわかっていますが、自分のものがなぜなのかわかりません。現れませんか?私が見逃しているある種の再描画方法はありますか?ここでどのように機能するのかよくわからないことをかなり試しまし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());
  });

}
4

1 に答える 1

2

ほとんどの場合、キャンバスの実際の描画寸法と 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.onMouseUpcanvas.onMouseUp

于 2014-06-20T04:46:17.230 に答える