Процесс startDrag не вызывает сеттеры x и y, поэтому необходимо выполнить настройку transform или transform.matrix.Если преобразование изменяется, вы можете переопределить свойство и наблюдать за изменением.С другой стороны, если изменяется свойство subform.matrix, вы не сможете обнаружить это, переопределив свойство transform.Единственное, что вы можете сделать, это либо вообще не использовать startDrag и использовать события мыши для перемещения объекта, либо вы можете создать подкласс класса Transform.Если вы создадите подкласс класса Transform и реализуете переопределение для свойства matrix, которое уведомляет родительский элемент об изменении, тогда вам также придется переопределить свойство transform того, что вы перетаскиваете, чтобы преобразовать любые экземпляры Transform в подклассный тип и связать его.это с преобразованным объектом для уведомления об изменении свойства матрицы.Было бы проще просто использовать события мыши вниз / перемещение / вверх для движения вместо startDrag.
И это все теоретически хорошо, за исключением того, что, кажется, это не работает при реализации.Например:
Подкласс класса Transform:
package
{
import flash.geom.Transform;
import flash.geom.Matrix;
import flash.geom.Matrix3D;
import flash.display.DisplayObject;
public class TransformNotify extends Transform
{
public var owner:DisplayObject;
public function TransformNotify( owner:DisplayObject )
{
super( owner );
this.owner = owner;
}
public override function get matrix():Matrix
{
trace( "acquiring matrix" );
return super.matrix;
}
public override function set matrix( m:Matrix ):void
{
trace( "matrix changing: " + m.tx + "," + m.ty );
super.matrix = m;
//Here you could actually alter some property of the owner to notify it that the matrix has changed
//if (owner != null)
//{
// owner.x = m.tx;
// owner.y = m.ty;
//}
}
}
}
Подкласс мувиклипа, который будет использовать преобразование с подклассами:
package
{
import flash.display.MovieClip;
import flash.geom.Transform;
public dynamic class MovieClipTransformed extends MovieClip
{
public function MovieClipTransformed()
{
super();
transform = convertToTransformNotify( super.transform );
}
public override function get transform( ):Transform
{
trace("acquiring transform" );
if (!(super.transform is TransformNotify))
{
var tn:TransformNotify = convertToTransformNotify( super.transform );
super.transform = tn;
return tn;
}
else
return super.transform;
}
public override function set transform( tf:Transform ):void
{
trace( "assigning new transform" );
if (!(tf is TransformNotify))
tf = convertToTransformNotify( tf );
else
(tf as TransformNotify).owner = this; //take ownership of transform
super.transform = tf;
}
function convertToTransformNotify( tf:Transform ):TransformNotify
{
var tfn:TransformNotify = new TransformNotify( this );
tfn.colorTransform = tf.colorTransform;
tfn.matrix = tf.matrix;
tfn.matrix3D = tf.matrix3D;
tfn.perspectiveProjection = tf.perspectiveProjection;
return tfn;
}
}
}
И попытка использовать класс:
//Main timeline code
import flash.display.Graphics;
import flash.events.MouseEvent;
var mct:MovieClipTransformed = new MovieClipTransformed();
var g:Graphics = mct.graphics;
g.moveTo( 0, 0 );
g.beginFill( 0xff0000 );
g.drawRect( 0, 0, 100, 100 );
g.endFill();
addChild( mct );
//Make sure override system is functioning properly; should trace that a change has occurred when transform.matrix is modified like so:
mct.transform.matrix = new Matrix( 1,0, 0, 1, 300, 10 ); //seems to function correctly
mct.addEventListener( flash.events.MouseEvent.MOUSE_DOWN, md, false, 0, true );
function md( m:MouseEvent ):void
{
mct.startDrag( false );
stage.addEventListener( flash.events.MouseEvent.MOUSE_UP, stageMouseUp, true );
}
function stageMouseUp(e:MouseEvent ):void
{
stage.removeEventListener( flash.events.MouseEvent.MOUSE_UP, stageMouseUp, true );
mct.stopDrag();
}
Когда вы перетаскиваете красный квадрат по экрану, обратите внимание, что ничего не отслеживается, поэтому свойство transform не обновляется, а также не изменяется свойство матрицы экземпляра transform.
Ручная настройка transform.matrix отслеживает «изменение матрицы: 300,10», как и ожидалось, хотя также сначала отслеживает «изменение матрицы: 0,0», предполагая, что она устанавливается дважды после ее получения, длянет явной причины.Я даже дублировал строку с другим значением, и снова оно устанавливается дважды, так что это не просто какой-то шаг инициализации.Кажется, что каждый раз, когда вы устанавливаете свойство transform.matrix, оно устанавливает один раз на свое текущее значение, а затем снова устанавливает новое значение.Странно.
Также интересно то, что если я пытаюсь переопределить свойство matrix3D, оно выдает мне ошибку «несовместимое переопределение», хотя я уверен, что сигнатура переопределения для него точно совпадает.Это должно быть какая-то ошибка или специальное ограничение.
Что-то очень, очень неправильно в том, как работает startDrag.Нет способа пассивно обнаружить изменения по мере их возникновения;их можно активно наблюдать только через таймер или проверяя наличие изменений по факту.Какая ужасная вещь startDrag.
Связанный вопрос, все еще не решает проблему, несмотря на утверждение об обратном. Как переопределить установщик transform.matrix