3

HTML5 full_screen API を使用して、この文字をブラウザのフルスクリーン モードに拡大しています。

デモと再現手順については、https://bubbleideas.com/letters/html5-full_screen-apiに従ってください。

ブラウザーがマウスのポインター位置の (x,y) 値を返す方法に問題/バグがあるようです。full_screen モードでは、下にスクロールすると、マウス ポインターと走り書きのパスの間にオフセットが導入されます。

問題を再現する手順は次のとおりです。(上記のデモリンクに移動)

  1. このページの右上にあるボタンをクリックしてください。

  2. 右下の描画ツール「フリーハンド」をクリック。ステーショナリー パネルが開きます (ペンまたは鉛筆ツールを選択します)。

  3. 描画領域に数回落書きします

  4. 少し下にスクロールして、同じペンで落書きしてみてください。マウス ポインターの位置と走り書きのパスの間にギャップ/オフセットがあることに気付くでしょう (これが問題です)。理想的には、フルスクリーンモードでもギャップがないようにする必要があります

誰かが前にここに来たことがありますか?また、これは正方形、円、三角形などの他の形状でもオフセットなしで完全に機能することに注意してください。

更新: (以下のコメントで「Iftah」が尋ねたように) fabric js に従って、マウスを押すたびにオフセットを再計算する calcOffset() を使用します。他の機能に関する限り、このようなことを行います。うまくいけば、これはいくつかのアイデアを与える

$("#rectangle-function").click(function (evt1) {
doCanvasUp();
initObjectDrawing();
//canvas.isDrawingMode = true;
canvas1 = document.createElement("canvas");
canvas1.height = canvas.height;
canvas1.width = canvas.width;
canvas1.id = "dummy-canvas";
canvas1.style.zIndex = 998;
canvas1.style.position = "absolute";
$(".page-body").prepend(canvas1);
$("#dummy-canvas").mousedown(function (evt) {
    var context1 = canvas1.getContext("2d");
    var offset = $("#dummy-canvas").offset();
    startX = evt.pageX - offset.left;
    startY = evt.pageY - offset.top;
    context1.beginPath();
    $("#dummy-canvas").mousemove(function (event) {
        context1.clearRect(0, 0, canvas1.width, canvas1.height);
        context1.strokeStyle = "#ff0000";
        context1.lineWidth = 1;
        context1.moveTo(startX, startY);
        var offset1 = $("#dummy-canvas").offset();
        var x = event.pageX - offset1.left;
        var y = event.pageY - offset1.top;
        var diffX = x - startX;
        var diffY = y - startY;
        context1.strokeRect(startX, startY, diffX, diffY);
        context1.closePath();
        context1.beginPath();
    }).mouseup(function (eventf) {
        $("#dummy-canvas").unbind('mousemove');
        $("#dummy-canvas").unbind('mouseup');
        var offset = $("#dummy-canvas").offset();
        //$("#dummy-canvas").remove();
        context1.clearRect(0, 0, canvas1.width, canvas1.height);
        var endX = eventf.pageX - offset.left;
        var endY = eventf.pageY - offset.top;
        var diffX = endX - startX;
        var diffY = endY - startY;
        var rect = new fabric.Rect({
            left: startX + diffX * 0.5,
            top: startY + diffY * 0.5,
            width: diffX,
            height: diffY,
            opacity: 1,
            fill: null,
            stroke: color
        });
        canvas.add(rect);
    });
});
4

1 に答える 1

0

コードを見ないと、エラーがどこにあるのか正確にわかりません...

1 つの問題は、マウスの座標を読み取るときに発生する可能性があります (IE. event.clientY の代わりに event.pageY を誤って使用している可能性や、同様の混乱が発生している可能性があります (「screenX/Y、clientX/Y、pageX/Y の違いは何ですか?」を参照) 。

または、問題はそれらの座標の使用方法にあると言えます。画面空間でマウスイベント座標を取得する場合は、キャンバスに適用する前に、キャンバス要素の画面オフセットを減算し、スクロールオフセットを追加する必要があります...

機能するツールと機能しないツールがあるため、それらを比較して、どこが違うかを確認できます。

于 2013-04-22T13:39:09.340 に答える