如何在 ActionScript 中正确地将一个矢量对象绘制到另一个矢量对象的特定位置,并考虑定位、透明度等?
我的想法(如这里所建议的那样)是使用beginBitmapFill
() 和() 将一个 MovieClipdrawRect
的位图副本(使用() 制作)绘制到 . 另一个 MovieClip 的属性,但事实证明这比我想象的要困难,主要是因为以下原因:BitmapData.draw
graphics
不保留透明度:源影片剪辑是透明的,目标图形变为白色。我试过使用 a似乎问题在于BlendMode
,但它没有帮助。似乎白色像素实际上被复制到 BitmapData 中。我一定错过了什么,但我不知道是什么。BitmapData
构造函数的文档是错误的:透明度不默认为true,而是false。所以如果你创建的new BitmapData(x, y, true)
透明度是保留的,否则不会。定位。如果源影片剪辑居中(中心位于 (0, 0),则在将其复制到 BitmapData 时必须应用矩阵来移动它,否则位图将仅包含源影片剪辑的右下角。弄清楚如何移动它很棘手,我认为它涉及以某种方式获取边界。(如果源对象在其画布中完全居中,您可以简单地将其偏移其宽度和高度的一半,当然。)
beginBitmapFill
平铺。似乎如果您不在drawRect
(0, 0) 处开始 (),则位图填充也不会从位图中的 (0, 0) 开始。这意味着您必须根据要开始绘制的位置再次移动源位图。
(然后还有其他东西,比如必须 lineStyle(0,0,0) 所以 drawRect() 不画边框等)
所有这些棘手的麻烦让我相信我正在以错误的方式解决这个问题。有没有更简单的方法来做到这一点?有没有图书馆可以帮助我?有没有人成功做到这一点?也许我的绘图画布不应该是 Sprite 而是 Bitmap?但是后来我不知道如何使用lineTo
() 等来绘制它。
情况如下:我有一个 Sprite,我使用它的 .graphics、lineTo() 等绘制它。现在我想在绘制时使用一个 MovieClip 作为画笔(或者只是将另一个 MovieClip 的副本放在绘图表面上),使另一个 MovieClip 成为第一个的图形的一部分。我不能addChild
() 因为那样矢量图形不会与绘制的图形交互。
编辑:Theo提供了一个完美的工作解决方案,除了它不应用应用于被绘制到图形表面上的 DisplayObject的旋转和缩放。这是Theo 的解决方案:
private function drawOntoGraphics(source : IBitmapDrawable, target : Graphics, position : Point = null) : void
{
position = position == null ? new Point() : position;
var bounds : Rectangle = DisplayObject(source).getBounds(DisplayObject(source));
var bitmapData : BitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
bitmapData.draw(source, new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y), null, null, null, true);
target.beginBitmapFill(bitmapData, new Matrix(1, 0, 0, 1, bounds.x + position.x, bounds.y + position.y));
target.drawRect(bounds.x + position.x, bounds.y + position.y, bounds.width, bounds.height);
}
为了支持旋转和缩放,我假设必须修改以下内容:
- 使用
Matrix
的draw()
应该从源复制缩放和旋转DisplayObject
? Matrix
使用的 in也beginBitmapFill()
应该复制这个缩放和旋转?或者这可能会产生“双重”缩放和旋转?drawRect()
应该修改坐标以匹配缩放和旋转的大小DisplayObject
?哪种方式getBounds()
不准确?
编辑:这是一个支持缩放和旋转的工作实现,由所有反馈制成:
static function DrawOntoGraphics(source:MovieClip, target:Graphics,
position:Point = null):void {
var sourceClass:Class = getDefinitionByName(getQualifiedClassName(source))
as Class;
var sourceCopy:MovieClip = new sourceClass();
sourceCopy.rotation = source.rotation;
sourceCopy.scaleX = source.scaleX;
sourceCopy.scaleY = source.scaleY;
sourceCopy.graphics.clear();
var placeholder:MovieClip = new MovieClip();
placeholder.addChild(sourceCopy);
if (!position)
position = new Point();
var bounds:Rectangle = placeholder.getBounds(placeholder);
var bitmapData:BitmapData = new BitmapData(bounds.width, bounds.height,
true, 0x00000000);
var drawMatrix:Matrix = new Matrix(1, 0, 0, 1, -bounds.x, -bounds.y);
bitmapData.draw(placeholder, drawMatrix);
placeholder.removeChild(sourceCopy);
var fillMatrix:Matrix = new Matrix(1, 0, 0, 1, bounds.x + position.x,
bounds.y + position.y);
target.beginBitmapFill(bitmapData, fillMatrix);
target.lineStyle(0, 0x00000000, 0);
target.drawRect(bounds.x + position.x, bounds.y + position.y,
bounds.width, bounds.height);
target.endFill();
}
有点相关但不那么热门的问题:如何在 Flex 3 中的图形上放置图像(例如 PNG)?