如何在ActionScript中正确地将一个向量对象绘制到另一个向量对象的特定位置,考虑到定位、透明度等?
我的想法(如建议
here
)使用
beginBitmapFill
()和
drawRect
()绘制位图副本(使用
BitmapData.draw
(第页)一个movieclip到。
graphics
其他movieclip的属性,但这比我想象的要困难,主要是因为以下原因:
-
不保留透明度
:如果源movieclip是透明的,则目标图形将变为白色。我试过用
BlendMode
但是没有帮助。看起来白色像素实际上被复制到位图数据中。我一定错过了什么,但我不知道是什么。
问题似乎在于
BitmapData
构造函数错误:透明度不默认为
真
但是
假
. 所以如果你创建一个
new BitmapData(x, y, true)
透明度是保留的,否则不会。
-
定位
.如果源movieclip居中(中心位于(0,0),则在将其复制到位图数据时必须应用矩阵来移动它,否则位图将只包含源movieclip的右下角。弄清楚要移动多少是很棘手的,我认为这涉及到以某种方式获得边界。(如果源对象在画布中完全居中,则可以将其偏移一半的宽度和高度。)
-
起始位图填充
瓷砖
. 如果你不开始
画矩形
()在(0,0)处,位图填充也不会从位图中的(0,0)开始。这意味着您必须根据要开始绘制的位置再次移动源位图。
(还有其他一些东西,比如必须使用LineStyle(0,0,0),这样drawRect()就不会绘制边框等。)
所有这些棘手的问题让我相信我走错了路。有更简单的方法吗?有没有图书馆可以帮助我?有人成功地做到了吗?也许我的画布不应该是精灵,而应该是位图?但是我不知道怎么用
lineTo
()等。
情况是这样的
:我有一个sprite,我用它的.graphics绘制,使用lineto()等。现在我想在绘制时使用movieclip作为画笔(或将另一个movieclip的副本放在绘图表面上),使另一个movieclip成为第一个movieclip图形的一部分。我不能
addChild
()因为矢量图形不会与绘制的图形交互。
编辑
:
Theo
提供了一个运行良好的解决方案
除了
因为它不适用于
旋转和缩放
应用于绘制到图形表面上的DisplayObject。这是
Theo's solution
:
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
?
-
这个
矩阵
用于
beginBitmapFill()
也应该复制这个缩放和旋转吗?或者可能会产生“双重”缩放和旋转?
-
这个
drawRect()
应修改坐标以匹配缩放和旋转的尺寸。
显示对象
?这意味着什么
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();
}
有点关联,但不是那么热门的问题:
How to put an image (say, PNG) on a graphics in Flex 3?