我们希望在flash as3中缩放,旋转和拖动功能。 我有一些代码。它的旋转功能运行良好。但是在我们旋转图像之后,缩放功能不起作用。
我们旋转,并将图像缩放一个参考点。
这是代码:
function scaleRotateFromPoint(sx:Number, sy:Number, ptCenter:Point, angle:Number):void{
var mat:Matrix = imgMat.clone();
mat.tx -= ptCenter.x;
mat.ty -= ptCenter.y;
mat.rotate (angle*(Math.PI/180));
mat.scale(sx,sx);
mat.tx += ptCenter.x;
mat.ty += ptCenter.y;
loaderFirst.transform.matrix = mat;
}
我们需要传递一个点,缩放值和旋转角度。
提前致谢。
答案 0 :(得分:0)
我刚刚在Flash中玩过你的功能,它对我来说似乎很有效。
我更改了代码,以便将变换对象作为参数,并在修改后设置修改后的矩阵,以确保正确使用它。
function scaleRotateFromPoint(t:Transform, sx:Number, sy:Number, ptCenter:Point, angle:Number):void {
var mat:Matrix = t.matrix;
mat.tx -= ptCenter.x;
mat.ty -= ptCenter.y;
mat.rotate (angle*(Math.PI/180));
mat.scale(sx,sy);
mat.tx += ptCenter.x;
mat.ty += ptCenter.y;
t.matrix = mat;
}
// usage:
scaleRotateFromPoint(clip.transform, 1.01, 1.01, new Point(277,185), 5 );
明显的问题可能是因为您在DisplayObject
的本地坐标中指定了中心点。 中心点在父坐标空间中指定。
如果需要在局部空间中指定co-ords,可以使用DisplayObject.localToGlobal()
和globalToLocal()
函数直接在坐标空间之间进行转换。 (或者,您可以invert()
使用本地矩阵,transformPoint()
可以在parent
的空格中获得一个点。)
答案 1 :(得分:-1)
我认为你的问题是你使用了旋转和缩放方法。这些都是很好的方法,但前提是你一次应用一个转换。
你应该将每个转换的结果分成一个矩阵(或正确使用a,b,c等字段),然后将它们相乘,使用.scale(),然后.rotate()可能会相互覆盖。
mScale.scale(0.5f,0.5f); mRotate.rotate(0.64); resultMatrix = new Matrix(image.matrix);
resultMatrix.multiply(mScale); resultMatrix.multiply(mRotate);
顺便说一下,这不会编译它只是为了展示它是如何实现的。希望这会有所帮助;)