Solution to Flex Image Rotation and Flipping around Center
March 17th, 2010 by Scott Selikoff
The Code
Without further ado, here’s the solution:
// Calculate rotation and offsets
var radians:Number = degrees * (Math.PI / 180.0);
var offsetWidth:Number = image.contentWidth/2.0;
var offsetHeight:Number = image.contentHeight/2.0;
// Perform rotation
var matrix:Matrix = new Matrix();
matrix.translate(-offsetWidth, -offsetHeight);
matrix.rotate(radians);
matrix.translate(+offsetWidth, +offsetHeight);
matrix.concat(image.transform.matrix);
image.transform.matrix = matrix;
}
Also, here’s a related function to perform a horizontal (left to right) flip of an image:
// Calculate offset
var offsetWidth:Number = image.contentWidth/2.0;
var offsetHeight:Number = image.contentHeight/2.0;
// Perform horizontal flip
var matrix:Matrix = new Matrix();
matrix.translate(-offsetWidth, -offsetHeight);
matrix.scale(-1, 1); // change to matrix.scale(1,-1) for vertical flip
matrix.translate(+offsetWidth, +offsetHeight);
matrix.concat(image.transform.matrix);
image.transform.matrix = matrix;
}
The Problem Explained
The problem, in a nutshell, is that Flex maintains the top left corner of the image for all transformation and ignores the center point. For example, just calling the rotate() method will produce rotations around the corner such as in this example. Many almost-solutions, see here and here, resolve this by first moving (translating) the image around its center by using the image’s vertical and horizontal midpoint.
A more complex issue arises, though, when the image is no longer positioned at its anchor, or in technical speak the image’s transformation tx/ty values are not 0. I found once you sufficiently drag/drop, rotate, or otherwise modify the image, all of the solutions tend to fall apart. In my situation, all the images were oriented with tx/ty referring to the anchor of the canvas, making these previous solutions difficult to rely upon.
The Solution Explained
After some fun manipulating matrices, I’ve written and tested a solution that will properly rotate an existing image around its center regardless of where it is positioned on the canvas or what transformations have been performed on it. It starts by applying rotation around the image’s center to the identity matrix. In this way, it simulates rotating the matrix around its midpoint translated position, but it is actually applied to the identity matrix. Once the rotational matrix has been calculated, the image is stuck at the top of the canvas. What we really need is a matrix that will take the rotational matrix we’ve just calculated and apply all the previous transformations to orient/rotate the image in the proper position. Well it so happens we have such a matrix, the image’s transformation matrix in fact! So, we apply the transformation matrix of the image to our calculated rotational matrix and voila! The result is our transformed image rotated by the specified amount around its center. We just set the image’s transformation matrix to this result and we are done.
Category: Flex.
Comments
Comment from Alex R
Time May 18, 2010 at 7:44 pm
Great !! worked perfect. Although, i’m using a custom component to resize the image and the x,y anchor points are on the right top instead con the default left top after flipping. I’ve been searching and didn’t found anything close to reassigning anchor points to an image in flex. Any ideas would be greatly appreciated !!!
Comment from JimP
Time May 23, 2010 at 12:50 pm
Matrices are a total mystery to me.
What online reference(s) to you recommend Flex developers study in order to to get a basic understanding of WTF these matrix thingies are, and how to manipulate them? I don’t want a graduate-level course in arcane mathematics — just the basic recipes.


Comment from Dan Z
Time May 6, 2010 at 12:28 pm
Thank you! Have you looked at this for 3D rotation?