7

簡単な引き出しの例をオンラインで見つけました。PC上では問題なく動作します。

プロジェクトのために、Android 2.2または4.2.2を搭載したGalaxy S4(4.2.2)でPhonegap 2.7を使用して実行すると、何も描画されません。

私は何を間違っていますか?

<html lang="en">
<head>
<meta charset="utf-8" />
<title>Desktops and Tablets</title>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8" src="cordova-2.7.0.js"></script>
<script type="text/javascript">
  $(document).ready(function () {
     initialize();
  });

  // works out the X, Y position of the click inside the canvas from the X, Y position on the page
  function getPosition(mouseEvent, sigCanvas) {
     var x, y;
     if (mouseEvent.pageX != undefined && mouseEvent.pageY != undefined) {
        x = mouseEvent.pageX;
        y = mouseEvent.pageY;
     } else {
        x = mouseEvent.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        y = mouseEvent.clientY + document.body.scrollTop + document.documentElement.scrollTop;
     }

     return { X: x - sigCanvas.offsetLeft, Y: y - sigCanvas.offsetTop };
  }

  var sigCanvas;
  var context;
  function initialize() {
    sigCanvas = document.getElementById("canvasSignature");
    context = sigCanvas.getContext("2d");
    context.strokeStyle = 'Black';
    context.lineWidth = 1;
    if ('ontouchstart' in document.documentElement) {
        var drawer = {
        isDrawing: false,
        touchstart: function (coors) {
              context.beginPath();
              context.moveTo(coors.x, coors.y);
              this.isDrawing = true;
           },
           touchmove: function (coors) {
              if (this.isDrawing) {
                 context.lineTo(coors.x, coors.y);
                 context.stroke();
              }
           },
           touchend: function (coors) {
              if (this.isDrawing) {
                 this.touchmove(coors);
                 this.isDrawing = false;
              }
           }
        };

        // create a function to pass touch events and coordinates to drawer
        function draw(event) {
            if (event.targetTouches[0] === undefined) {
                context.closePath();
                this.isDrawing = false;
                return;
            }
           // get the touch coordinates.  Using the first touch in case of multi-touch
           var coors = {
              x: event.targetTouches[0].pageX,
              y: event.targetTouches[0].pageY
           };
           // Now we need to get the offset of the canvas location
           var obj = sigCanvas;
           if (obj.offsetParent) {
              // Every time we find a new object, we add its offsetLeft and offsetTop to curleft and curtop.
              do {
                 coors.x -= obj.offsetLeft;
                 coors.y -= obj.offsetTop;
              }
              // The while loop can be "while (obj = obj.offsetParent)" only, which does return null
              // when null is passed back, but that creates a warning in some editors (i.e. VS2010).
              while ((obj = obj.offsetParent) != null);
           }

           // pass the coordinates to the appropriate handler
           drawer[event.type](coors);
        }
        // attach the touchstart, touchmove, touchend event listeners.
        sigCanvas.addEventListener('touchstart', draw, false);
        sigCanvas.addEventListener('touchmove', draw, false);
        sigCanvas.addEventListener('touchend', draw, false);
        // prevent elastic scrolling
        sigCanvas.addEventListener('touchmove', function (event) {
           event.preventDefault();
        }, false); 
     }
     else {
         // start drawing when the mousedown event fires, and attach handlers to
        // draw a line to wherever the mouse moves to
        $("#canvasSignature").mousedown(function (mouseEvent) {
           var position = getPosition(mouseEvent, sigCanvas);

           context.moveTo(position.X, position.Y);
           context.beginPath();
           $(this).mousemove(function (mouseEvent) {
              drawLine(mouseEvent, sigCanvas, context);
           }).mouseup(function (mouseEvent) {
              finishDrawing(mouseEvent, sigCanvas, context);
           }).mouseout(function (mouseEvent) {
              finishDrawing(mouseEvent, sigCanvas, context);
           });
        });

     }
  }

   // draws a line to the x and y coordinates of the mouse event inside
  // the specified element using the specified context
  function drawLine(mouseEvent, sigCanvas, context) {
      var position = getPosition(mouseEvent, sigCanvas);

     context.lineTo(position.X, position.Y);
     context.stroke();
  }

   // draws a line from the last coordiantes in the path to the finishing
  // coordinates and unbind any event handlers which need to be preceded
  // by the mouse down event
  function finishDrawing(mouseEvent, sigCanvas, context) {
     // draw the line to the finishing coordinates
     drawLine(mouseEvent, sigCanvas, context);
      context.closePath();
      // unbind any events which could draw
     $(sigCanvas).unbind("mousemove")
                 .unbind("mouseup")
                 .unbind("mouseout");
  }
</script>
</head>
<body>
<h1>Canvas test</h1>
<div id="canvasDiv">
   <canvas id="canvasSignature" width="500px" height="500px" style="border:2px solid #000000;"></canvas>
</div>
</body>
</html> 
4

4 に答える 4

5

Galaxy S4 でも同じ問題が発生しています。HTML キャンバスの描画が webview に表示されませんが、Safari ブラウザーでは機能します。Galaxy S2、S3 には同じ問題はありません。

私の場合、ハードウェア アクセラレーションを無効にすると、キャンバスが機能します。

appView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);

しかし、それは非常に遅いです。PhoneGap とは何の関係もありません。おそらく、Samsung は実装に別のバグを作成しました。

于 2013-07-16T06:56:33.143 に答える
1

座標0,0に画像を描画しようとすると、Galaxy S4が「バグアウト」します。

キャンバス内で要素をドラッグし、それらの座標に描画されている色が画面全体をカバーしているため、これに気づきました。

キャンバス内の 0,0 座標をカバーする画像がないポイントにドラッグすると、アプリケーションは正常に実行されます。また、デスクトップ ブラウザでは発生しませんでした。非常に奇妙な。

私はただ実行します:

context.clearRect(0,0,1,1);

私の描画機能の最後に、それは私のためにそれを解決しました。少なくとも試してみる価値があります。

ただし、友人の Galaxy S3 はこれを行いませんでした。

于 2013-08-13T22:48:52.903 に答える
0

Crosswalk の使用を検討する必要があります。これはデフォルトの android webview を置き換えますが、これは非常に一貫性がなく (通常、各ベンダーが独自に実装しています)、すべての android バージョンとベンダー間でアプリケーションの一貫性を保つことは困難です。

Crosswalk には Cordova 互換バージョンがあり、すべてのテストでパフォーマンスの向上が顕著です。

https://crosswalk-project.org/

于 2014-11-25T13:59:42.950 に答える
0

Phonegap Build または Eclipse でビルドしていますか? Eclipse の場合、プロジェクトは正しくセットアップされていますか?

phonegap$(document).ready(function () {$(document).on("deviceready",function () { deviceready イベントを使用して、初期化されたときに通知するため、 に置き換えます。

また、jQuery JS ファイルをプロジェクト内に保存します。HTTP 要求が失敗した場合、または Android デバイスに接続がない場合、アプリは jQuery を読み込めないため、読み込みに失敗します。

したがって、交換<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

<script type="text/javascript" src="jquery.min.js"></script>

これらの変更を加えて上記のコードを試しました (さらにデバッグを追加しました)。Android 2.2.3 を実行している HTC HD2 と Android 4.2.2 を実行している Nexus 7 で正常に動作します。

これは、テスト用に作成した Eclipse プロジェクトと結果の Android APK を含むzip ファイルです。お使いのデバイスで試してみて、動作するかどうかを確認してください。

于 2013-06-08T09:08:09.827 に答える