2010-07-22 4 views
2

q1: Возможно ли иметь невидимый прямоугольник?Проблема с холстом HTML5!

q2: Можно ли назвать метод по методу? Смотри ниже.

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

ctx.fillStyle = ""; 
ctx.strokeStyle = ""; 
// as far FF 3.67 goes, no way 
// the goal is to fill the rectangle with some text 
ctx.fillRect(50,50,50,20).fillText("you rock",250,250); 

Спасибо.

ответ

0

Зачем вам нужен невидимый прямоугольник? Я предполагаю использовать в качестве границ для вашего звонка fillText(). Ответ отрицательный: после того, как вы вызываете fillRect(), у холста нет концепции прямоугольника, существующего в определенном месте. Подумайте о том, что холст представляет собой туманную коллекцию пикселей, не более того, с помощью только некоторых вспомогательных методов, поэтому вам не нужно устанавливать пиксели по одному.

+0

ну, мне нужна возможность переместить блок текста на холст в другое место того же холста, и есть несколько блоков текстов (скажем, 20). И кажется, что было бы легче перемещать прямоугольник внутри холста и блок текста, следовательно, вопросы. PLS см. следующий поток для «большой» цели вопроса, спасибо. http://stackoverflow.com/questions/3313918/how-to-use-mouse-event-instead-of-keycode-for-html5-canvas-and-jquery –

+1

Вы не можете перемещать что-либо в холсте, изменять только пиксели. Если вам нужно отслеживать, где вам нужно сделать это отдельно или использовать библиотеку, которая сделает это за вас. – pr1001

+0

svg, svg, спасибо. –

4

q1: возможно ли иметь невидимый прямоугольник?

Действительно, это так!

ctx.fillStyle = 'rgba(255,255,255,0)'; 
ctx.fillRect(50,50,50,20); 

Хотя это работает, и это немного более кратким:

; 

q2: можно вызвать метод по методу?

Предположительно вы могли бы сделать что-то вроде этого:

//Naive generic chainer function 
//returns this even if the default 
//value is significant! 
function chain(obj) { 
function F() {} 
F.prototype = obj; 
var cobj = new F(); 

for (var i in obj) { 
    if (typeof obj[i] == 'function') { 
    //Function Bind-ish 
    cobj[i] = (function() { 
     var method = i; 
     return function() { 
     this.constructor.prototype[method].apply(this, arguments); 
     return this; 
     }; 
    }()); 
    } 
} 
return cobj; 
} 


var chained = chain(ctx); 

chained.fillRect(0,0,200,200) 
.fillRect(100,100,200,200) 
.fillRect(400,400,100,100) 
.fillText("I CAN HAS INVISDIBLE??", 250, 250); 

Но зачем, когда вы можете сделать это:

with (ctx) { 
    fillRect(100,100,200,200); 
    fillRect(300,300,100,100); 
    fillStyle = 'green'; //I CAN SEE 
    fillText("SCREW BEST PRACTICES"); 
} 
+0

Хорошо, спасибо. Но я думаю, что мои вопросы недостаточно ясны относительно их цели. Пожалуйста, ознакомьтесь со следующим вопросом, который я разместил без удовлетворительных ответов: http://stackoverflow.com/questions/3313918/how-to-use-mouse-event-instead-of-keycode-for-html5-canvas-and-jquery В оболочке ореха я хотел бы иметь возможность поместить некоторый текст внутри прямоугольника, поскольку кажется немного легче для маневрирования (sp?), Чем блок текста, цель состоит в том, чтобы иметь возможность перемещать некоторый текст вокруг внутри холста. –

+2

Перевод между клавиатурой и мышью будет казаться вопросом, который действительно не связан с холстом. Как уже было сказано здесь, вы не можете ничего перемещать на холсте. Вы можете просто имитировать движение, рисуя что-то, очищая холст, а затем рисуя одно и то же в немного другом положении. Вы уверены, что не должны просто использовать DOM и CSS для этого? – MooGoo

+0

Да, похоже, что SVG - это путь, спасибо. –

2

Вы, кажется, пытается использовать холст элемент как SVG. Вместо этого попробуйте использовать Raphaël. Ваши «текстовые объекты» фактически будут объектами, и вы можете перемещать их, настраивая их атрибуты, вы также можете определить группу и переместить их все за одну операцию. Вы также сможете приложить к ним onclick событий.

+0

Да, SVG - ребенок. ТКС. –

0

вам нужна структура данных, чтобы отслеживать ваши текстовые объекты внутри вашего холста. Когда вы пишете на холсте, вы не можете узнать, какой объект вы нарисовали. Вы можете получить информацию о пикселях, но не объект. Поэтому следите за объектами в массиве, когда вы рисуете на холсте. А затем напишите обработчик мыши, чтобы обнаружить клики на холсте, а затем отобразить его обратно с использованием структуры данных.

0

Вы должны проверить Canvas.js, это небольшая библиотека Роб Larsen, что позволяет ctx.chaining, https://github.com/roblarsen/CanvasJS

Невидимые прямоугольники, возможно, конечно. Я не вижу причин, почему нет.

Вы можете сделать strokeStyle = независимо от того, какой цвет фона имеет прямоугольник, 1px.

Это требует заполнения или глажения, хотя, я уверен. Если вы этого не сделаете, то методы, которые вы используете для его создания, rect() или что-то еще, будут находиться в состоянии контекста, поэтому всякий раз, когда вы заполняете или инсульт, он будет применяться к прямоугольнику.

Использование .save() и .restore() - помогает разделить состояние стека и отступы также и вашего кода.Легче читать и следить за штатными стеками.

Смежные вопросы