2011-10-08 7 views
11

mam kod:Moving pozycję początkową płótnie wzór

function draw(ctx) { 
    // create new image object to use as pattern 
    var img = new Image(); 
    img.onload = function(){ 
    // create pattern 
    var ptrn = ctx.createPattern(img,'repeat'); 
    ctx.fillStyle = ptrn; 
    ctx.fillRect(0,0,150,150); 
    } 
    img.src = 'images/wallpaper.png?' + new Date().getTime(); 
} 

Jak mogę przenieść pozycję początkową wzór zdjęcie?

Odpowiedz

14

Można to osiągnąć poprzez tłumaczenia płótno, opierając się na nim, a następnie przekłada ją z powrotem do punktu wyjścia:

function draw(ctx) { 
    // create new image object to use as pattern 
    var img = new Image(); 
    img.onload = function(){ 
     // create pattern 
     var ptrn = ctx.createPattern(img,'repeat'); 
     ctx.fillStyle = ptrn; 

     // offset vars 
     var offset_x = 60; 
     var offset_y = 75; 
     var fill_x = 500; // could be canvas.width 
     var fill_y = 500; // could be canvas.height 

     // offset 
     ctx.translate(offset_x, offset_y); 

     // draw 
     ctx.fillRect(-offset_x, -offset_y, fill_x, fill_y); 

     // undo offset 
     ctx.translate(-offset_x, -offset_y); 
    } 
    img.src = 'images/wallpaper.png?' + new Date().getTime(); 
} 
+0

@GLeBaTi Właśnie zredagowałem kod, który tutaj zamieściłem. Ważną zmianą jest to, że wywołanie 'fillRect()' wypełnia tylko obszar o żądanym rozmiarze (np. 'Fill_x' i' fill_y'), ponieważ przekazujemy początek jako nasz offset. Poprawiłem również znaki na offsecie używanym do połączeń translate, aby wyniki były nieco bardziej intuicyjne. – Xenethyl

18

W odpowiedzi na przyjętą odpowiedzi: zamiast cofnąć przesunięcie, to użyłby save() & restore() aby uniknąć potencjalnych problemów:

ctx.save(); 
ctx.translate(offset_x, offset_y); 
ctx.fillRect(-offset_x, -offset_y, fill_x, fill_y); 
ctx.restore(); 
+2

'zapisz' i 'przywróć' wydaje się być sposobem uporządkowania. – mokagio

+2

Dla czegoś tak trywialnego jak stosowanie pojedynczej transformacji do kontekstu nie polecałbym używania 'save()' i 'restore()'. Z manipulacją stosem stanów wiąże się obciążenie (choć minimalne), a jeśli zrobisz to za każdą prostą transformację, otrzymasz niepotrzebne trafienie wydajnościowe. Zobacz ten jPerf (którego nie biorę pod uwagę) dla szybkiego porównania: http://jsperf.com/canvas-transform-vs-save-restore/2 – Xenethyl

+0

Nieco ponad rok później, test perfekcyjny powyżej mówi że zapisywanie/przywracanie jest szybsze niż ponowne tłumaczenie (przynajmniej w Firefox i Chrome na OS X). W przypadku czegoś tak prostego, obawy dotyczące wydajności nie powinny koniecznie przeważać w prostocie i czytelności. Ale tak jak w przypadku każdego kodu, wszyscy mamy swoje osobiste preferencje :) – cacheflowe

0

bardziej ogólne, skomplikowanych przekształceń wzoru sami są łatwo zrobić. Sztuczka polega na wykonaniu ich bezpośrednio przed wywołaniem funkcji wypełniania() lub obrysu().

function draw(ctx) { 
    // create new image object to use as pattern 
    var img = new Image(); 
    img.onload = function(){ 
     // create pattern 
     var ptrn = ctx.createPattern(img,'repeat'); 
     ctx.fillStyle = ptrn; 
     ctx.beginPath(); 
     ctx.rect(0, 0, 150, 150); 

     ctx.translate(-33, -33); 
     ctx.fill(); 
    } 

    img.src = 'images/wallpaper.png?' + new Date().getTime(); 
} 
Powiązane problemy