2015-04-27 13 views
5

Próbuję przejść przez HTML5 canvas. Udało mi się rysować na płótnie, ale muszę to robić dynamicznie. To jest mój kod JavaScript:jak rysować na płótnie przeczytać json?

var c=document.getElementById("yellow"); 
var ctx=c.getContext("2d"); 

ctx.beginPath(); 
ctx.moveTo(247,373); 
ctx.lineTo(0,390); 
ctx.lineTo(5,21); 
ctx.lineTo(245,0); 
ctx.lineTo(247,373); 
ctx.closePath(); 
ctx.fillStyle="#ffca05"; 
ctx.globalAlpha=0.7; 
ctx.strokeStyle = '#ffca05'; 
ctx.fill(); 
ctx.stroke(); 

muszę czytać dane z tego json array i rysować używając tych współrzędnych.

[{"x":"247", "y":"373"}, {"x":"0", "y":"390"},{"x":"5", "y":"21"},{"x":"245", "y":"0"}, {"x":"247", "y":"373"}] 
+1

próbowałeś go z 'for' pętli że wielokrotnie wykonuje' ctx.lineTo (json [i] .x, json [i] .y); '? (Pierwsze 'ctx.lineTo' działa jak' ctx.moveTo'). – Xufox

Odpowiedz

2

Wszystko co musisz zrobić, to iteracyjne nad obiekt JS w for pętli i wielokrotnie wykonać ctx.lineTo(). Uwaga: pierwszy ctx.lineTo() po ctx.beginPath() działa jak ctx.moveTo().

Można uruchomić ten fragment kodu, aby sprawdzić wynik:

var c=document.getElementById("yellow"); 
 
var ctx=c.getContext("2d"); 
 
var json=[ 
 
    {"x":"247", "y":"373"}, 
 
    {"x":"0", "y":"390"}, 
 
    {"x":"5", "y":"21" }, 
 
    {"x":"245", "y":"0" }, 
 
    {"x":"247", "y":"373"} 
 
]; 
 

 
ctx.beginPath(); 
 
for(var i in json){ 
 
    ctx.lineTo(json[i].x,json[i].y); 
 
} 
 
ctx.closePath(); 
 
ctx.fillStyle="#ffca05"; 
 
ctx.globalAlpha=0.7; 
 
ctx.strokeStyle="#ffca05"; 
 
ctx.fill(); 
 
ctx.stroke();
<canvas id="yellow" width="250" height="400"></canvas>

PS: mogę zauważyć, że górny narożnik przy górnej krawędzi obszaru roboczego (i przypuszczalnie lewa również) są nieco odcięte. Wystarczy dodać 1 lub tak, aby każda współrzędna to naprawić:

[ 
    {"x":"248", "y":"374"}, 
    {"x":"1", "y":"391"}, 
    {"x":"6", "y":"22" }, 
    {"x":"246", "y":"1" }, 
    {"x":"248", "y":"374"} 
]; 
+0

jeszcze jedno pytanie i czy mój plik jest zewnętrzny? –

+0

@BrunoLaise Masz na myśli plik JSON? Myślę, że musisz [dostać to przez AJAX] (http://jaskokoyn.com/2013/07/24/external-json-file/) lub tak ... Nie wiem, nigdy tego nie robiłem. – Xufox

+1

To jest [zły pomysł, aby użyć 'for ... in' do iterowania po tablicy] (http://stackoverflow.com/questions/500504/why-is-using-for-in---ray-iteration -such-a-bad-idea). ['Array.prototype.forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) lub po prostu normalne [' for'] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) Oświadczenie byłoby lepsze. –

0

nie mogę wypowiedzieć się jeszcze, ale jak do tej kwestii czytania zewnętrznego pliku JSON: Jeśli plik jest dostępny na jakiś URL, można użyć AJAX poprzez jQuery, aby łatwo uzyskać potrzebne dane JSON, przeanalizuj je i przechowuj w zmiennej lokalnej na stronę/aplikację. Krótki przykład:

var myJSON; //the json object data you're going to draw to canvas with 

$(document).ready(function(){ 
     $.ajax({ 
      url: "myurl.com/myjsonfile", 
      dataType: "text", 
      success: function(data) { 
       myJSON = $.parseJSON(data); 
       drawToCanvas(myJSON); //you can, perhaps, make the code 
             //Xufox provided into a function that 
             //you pass your myJSON var to once it 
             //is loaded. 
      } 
     }); 
    }) 

The „$ .ajax” wezwanie zajmie uzyskanie danych z adresu URL podanego powyżej, a wykona metodę "drawToCanvas() tylko wtedy, gdy dane zostały załadowane i przekazywane do myJSON (który jest następnie przekazywany do metody).

Państwo mogli odwoływać parametr bezpośrednio w swojej funkcji, lub zapisać go w zmiennej lokalnej:

function drawToCanvas(jsonObj) { 
    var json = jsonObj; 

    ctx.beginPath(); 
    for(var i in json){ 
     ctx.lineTo(json[i].x,json[i].y); 
    } 
    ... 
+1

['for ... in' nie powinno być używane do iterowania po tablicy] (http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such- zły pomysł). ['Array.prototype.forEach'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) lub normalny [' for'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) Oświadczenie byłoby lepsze. –

+0

Tak. Po prostu skopiowałem kod wcześniejszego komentatora przekazanego Bruno. Byłoby całkiem łatwo użyć tutaj forEach, ponieważ każdy z obiektów jest zawarty w tablicy. – JLP1990