холст переместился на startDrag () без вызова set x / y или move () - как startDrag () точно работает в as3 / flex? - PullRequest
0 голосов
/ 11 февраля 2011

у меня есть класс .as, который расширяет mx.containers.Canvas (это перетаскиваемая граница изменяемого размера компонента), он становится перетаскиваемым на MOUSE_DOWN и перестает быть перетаскиваемым на MOUSE_UP, MOUSE_OUT и ROLL_OUT. < бр /> перед вызовом startDrag() я создаю Rectangle для определения области перетаскивания, у меня также есть переменная _dragging: Boolean, чтобы контролировать, можно ли ее перетаскивать в данный момент.

проблема в том, что когда я щелкаю эту границу, она переходит на отрицательную координату без вызова startDrag или переключения _dragging на true.

я переопределил get x, set x, get y, set y и move() методы для его решения, но единственное, что я получил, это то, что позиция изменяется без вызова установщиков координат или перемещения (), но в тот момент, когда он изменяется, вызывается метод получения и возвращает новое (отрицательное) значение

поэтому мой вопрос , что происходит на startDrag() и как фильтровать нежелательные входящие значения координат?

Ответы [ 4 ]

1 голос
/ 10 октября 2014

Процесс 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

1 голос
/ 07 марта 2011

Это всего лишь выстрел в темноте, но, учитывая то, что я недавно работал с подобными частями flex, это может быть ответом: матрица трансформации модифицируется Это позволило бы объекту отображаться в другом месте без изменения его локальной позиции. Пожалуйста, примите мой ответ с большим количеством соли, потому что я не проверял его. Тем не менее, вы можете проверить это, посмотрев переменные в объекте transform.matrix в вашем объекте.

0 голосов
/ 12 марта 2011

Начните с этого

var bounds:Rectangle = new Rectangle( 0,0,this.width,this.height)
this.dragBar.startDrag( false,bounds );

и удалите все свои переопределения, которые вы добавили;

У меня такое чувство, что ваши границы неверны, и он "прыгает", потому что границы блокируют его там. Вы не можете перетащить за пределы. Еще одна вещь, которую вы можете попробовать, это перетащить ее после того, как она «прыгнула». Это определенно скажет вам, что это проблема границ.

0 голосов
/ 11 февраля 2011

Когда вы добавляете прямоугольник, проверьте точку регистрации (т.е. там, где находится верхний левый угол). Похоже, вы смешиваете глобальную координату и координату области перетаскивания.

Если вы можете вставить свой код сюда, это поможет людям продолжить анализ для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...