2013-05-26 9 views
7

Znalazłem prosty przykład szuflady online. Działa dobrze na komputerze.Nie można rysować na płótnie HTML5 za pomocą Phonegap 2.7

Po uruchomieniu, używając Phonegap 2.7, na moim Galaxy S4 (4.2.2), z Androidem 2.2 lub 4.2.2, dla projektu, po prostu nic nie rysuje.

Co robię źle?

<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> 

Odpowiedz

5

Mam taki sam problem w Galaxy S4. Rysunek HTML na płótnie nie jest wyświetlany w widoku sieciowym, ale działa w przeglądarce Safari. Galaxy S2, S3 nie mają tego samego problemu.

W moim przypadku po wyłączeniu przyspieszania sprzętowego płótno działa.

appView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null); 

ale jest bardzo wolny. Nie ma to nic wspólnego z PhoneGap. Prawdopodobnie Samsung popełnił kolejny błąd w ich realizacji.

+0

DZIĘKUJEMY TAK DUŻO !!! :) –

+0

Wyłączenie akceleracji sprzętowej sprawia, że ​​rzeczy "działają", ale nie jest to bardzo dobre rozwiązanie produkcyjne dla płótna. Niestety nie mam żadnych lepszych sugestii. – Josh

0

Budujesz za pomocą Phonegap Build lub Eclipse? Jeśli Eclipse, czy masz poprawnie skonfigurowany projekt?

Wymień $(document).ready(function() { na $(document).on("deviceready",function() { , ponieważ phonegap używa zdarzenia deviceready do sygnalizowania, kiedy się zainicjował.

Zapisz także plik jQuery JS wewnątrz projektu; jeśli żądanie HTTP nie powiedzie się lub twoje urządzenie z Androidem nie ma połączenia, aplikacja nie załaduje się, ponieważ nie może załadować jQuery.

Dlatego zastąpić <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

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

Próbowałem powyższy kod z tych modyfikacji (plus dodałem trochę debug) i działa dobrze na moim HTC HD2 z systemem Android 2.2.3 i mojego Nexus 7 bieg Android 4.2.2

Here's a zip file zawierający projekt Eclipse, który utworzyłem, aby przetestować go i wynikowy plik APK systemu Android. Wypróbuj swoje urządzenia i sprawdź, czy to działa.

+0

Dzięki za komentarz .. (Link zostanie zaksięgowana jest uszkodzony jak na razie) zrobiłem wszystko, co napisałem, ale to nie rozwiązuje problemu, płótno otwiera, ale gdy Dotykam tego (z moim Galaxy S4 4.2.2) - nic się nie dzieje .. –

+0

Link nadal działa dla mnie, spróbuj ponownie: [http://ge.tt/9kqdrmi/v/0](http://ge. tt/9kqdrmi/v/0) – DaveAlden

+0

Tak, teraz działa, ale nadal, twój projekt "jak jest" też nie działa. Zgaduję, że to problem z Galaxy S4? –

1

My Galaxy S4 "usuwa błędy", gdy próbuję narysować dowolny obraz do współrzędnych 0,0.

Uświadomiłem sobie to tylko dlatego, że przeciągam elementy wewnątrz płótna, a jakikolwiek kolor jest narysowany do tych współrzędnych, obejmuje cały ekran.

Po przeciągnięciu do punktu, w którym nie ma obrazu pokrywającego współrzędne 0,0 w obszarze roboczym, moja aplikacja działa normalnie. Również nigdy nie zdarzyło się w przeglądarce na komputerze. Bardzo dziwny.

prostu uruchom:

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

na końcu mojej funkcji rysować, a to rozwiązać go dla mnie. Warto spróbować przynajmniej.

Moja przyjaciółka Galaxy S3 nie zrobiła tego jednak.

0

Należy rozważyć użycie przejścia dla pieszych.Zastępuje on domyślną przeglądarkę internetową, która jest bardzo niespójna (każdy dostawca zwykle nakłada własną) i trudno jest utrzymać spójność aplikacji wśród wszystkich wersji Androida i dostawców.

Crosswalk ma wersję kompatybilną z Cordowią i we wszystkich moich testach zauważalny jest wzrost wydajności.

https://crosswalk-project.org/

Powiązane problemy