这是(令人惊讶的)
c.getContext2d().rect(0, 0, 299, 149);
...无论画布的实际像素大小是多少。原因是,300x150 是默认坐标空间大小,请参阅http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element
您可以通过使用canvas.setCoordinateSpaceWidth()
和更改canvas.setCoordinateSpaceHeight()
为您想要的任何内容。
通常,人们想要独立于画布的实际大小进行绘制,因此他们只需将坐标空间设置为 100x100 之类的东西,绘制的图像就会自动缩放。
但是,您可能想了解实际的画布像素大小:
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
final int clientWidth = canvas.getElement().getClientWidth();
final int clientHeight = canvas.getElement().getClientHeight();
setupCoordinateSpace(canvas, clientWidth, clientHeight);
drawMyImage(canvas);
}
});
请注意,这必须在 中完成scheduleDeferred
,因为只有在浏览器有机会执行布局之后才能知道客户端大小。
您可以使用此信息来调整纵横比以匹配画布(我建议这样做,否则您会得到扭曲的图像)
void setupCoordinateSpace(Canvas canvas, int clientWidth, int clientHeight) {
final double aspect = (double) clientWidth / (double) clientHeight;
canvas.setCoordinateSpaceHeight(
(int) (myCoordinateSpaceWidth / aspect));
}
或者,您也可以设置坐标空间以匹配像素大小,这样您就可以在 HTML5 画布上执行像素精确绘图:
void setupCoordinateSpace(Canvas canvas, int clientWidth, int clientHeight) {
canvas.setCoordinateSpaceWidth(clientWidth);
canvas.setCoordinateSpaceHeight(clientHeight);
}
坐标空间设置好后,可以调用drawMyImage()