【发布时间】:2014-03-31 10:56:14
【问题描述】:
我最近在创建自定义 flex 组件时遇到了一个问题,它出现在 lineTo 行为中。
假设我使用宽度为 200、200 的 drawRect 绘制了一个 Rectangle。这意味着它的坐标范围为 0、0 到 199、199。然后我在这个矩形内绘制一条从 0、10 到 200、10 的线。它绘制正确地从 0、10 到 199、10,即线的右端与 Rectangle 的右边缘对齐;没有过冲/下冲。下面是代码。
var g:Graphics = graphics;
g.clear();
g.beginFill(0x0000ff, 1);
g.drawRect(0, 0, unscaledWidth, unscaledHeight);
g.endFill();
g.lineStyle(0, 0xff0000, 1);
g.moveTo(0, 10);
g.lineTo(200, 10);
这是否意味着 lineTo 不包括最后一点 (199,10)?我用 getBounds/getRect 试过这个(只有一条没有矩形的水平线,它也打印为(x:0,y:10,w:200,h:0)。即宽度为 200(从 0 到199)。
var g:Graphics = graphics;
g.clear();
g.lineStyle(0, 0xff0000, 1);
g.moveTo(0, 10);
g.lineTo(200, 10);
trace ("Bounds:", getBounds(this)); // prints (x:0, y:0, w:200, h:0)
trace ("Rect:", getRect(this)); // prints (x:0, y:0, w:200, h:0)
但是,如果我从右到左画线,从 (199, 10) 到 (-1, 10)。直线的右端和 Rectangle 的右边缘之间有一个间隙。这条线也超出了左侧的 Rectangle 一个单位。
var g:Graphics = graphics;
g.clear();
g.beginFill(0x0000ff, 1);
g.drawRect(0, 0, unscaledWidth, unscaledHeight);
g.endFill();
g.lineStyle(0, 0xff0000, 1);
g.moveTo(199, 10);
g.lineTo(-1, 10);
这似乎是从右到左的 lineTo 行为与从左到右的 lineTo 行为不同;我怀疑是这种情况,我认为我遗漏了一些东西。有谁知道我错过了什么?
编辑:user2139426 的后续回答
也就是说,如果我从 (0, 0) 到 (200, 0) 画一条线。将从 (0,0) 的左上角(包括整个像素宽度)绘制到 (200, 0) 的左上角(仅包括像素 (199, 0) 和一小部分)在 (200, 0) 中。那是对的吗?
实际包含左上角的哪个部分,这点能知道吗?
这似乎是一个非常重要的细节。我通读了 Adobe 文档、Essential Actionscript、AS Bible 等,他们总是解释为好像包含了整个像素。您是否知道任何可以清楚地解释此类内容的资源(文档/书籍)?还是只是一般的图形编程(我是新手)。
【问题讨论】:
标签: flash actionscript drawing behavior