Масштабирование в AS ScrollPane, но мне нужно сосредоточиться на местоположении мыши

Я работаю во Flash ActionScript 3. У меня есть сцена с несколькими вариантами выбора. Щелчок по каждому из них открывает панель прокрутки (во весь экран 1920x1080) с изображением (изображения различаются по размеру, но все начинаются с высоты 1080, а ширина обычно 4000 и более).

Я разрешаю пользователю использовать scrollDrag для панорамирования и просмотра полного изображения. Я также добавил функцию масштабирования, при которой при использовании колеса прокрутки на мыши изображение будет немного увеличиваться и уменьшаться.

В чем моя проблема, мне нужно найти способ сделать так, чтобы масштабирование действительно увеличивалось в том месте, где находится мышь, когда срабатывает движение колеса.

В настоящее время я позволяю масштабированию происходить только до определенного уровня (вход и выход).

Я пробовал несколько вещей, включая content.x/y, content.width/height, horizontalScrollPosition и maxHorizontalScrollPosition, и я просто не могу найти правильную формулу, чтобы сосредоточиться на нужной области.

Я добавляю прослушиватель событий для колесика мыши в панель прокрутки aSp2, и вот функция, которую он запускает:

function onMouseWheelEvent(MouseEvent):void{
    var mouseXPos = MouseEvent.stageX;
    var mouseYPos = MouseEvent.stageY;

    var imageWidth = aSp2.content.width;

    trace("ContentWidth = "+imageWidth+"\nmouse X = "+mouseXPos+"\nmouse Y = "+mouseYPos);









    if(MouseEvent.delta > 0){
        if(zoomCounter > 0){
            if(zoomCounter != 5){

            //var moveRight = aSp2.horizontalScrollPosition;
            //var moveDown = aSp2.verticalScrollPosition;


            //moveRight = moveRight + aSp2.content.width/2;
            //moveDown = moveDown + aSp2.content.height/2;

            //var centerX;
            //var centerY;


            //trace("MoveRight = "+moveRight+"\nMoveDown = "+moveDown);

            //trace("MaxWidthScroll = "+aSp2.maxHorizontalScrollPosition+"\nMaxHeightScroll = "+aSp2.maxVerticalScrollPosition);

            //trace("HScroll = "+aSp2.horizontalScrollPosition);
            //trace("Content X = "+aSp2.content.x);

            aSp2.content.scaleX += 1.1;
            aSp2.content.scaleY += 1.1;




            //aSp2.horizontalScrollPosition = aSp2.horizontalScrollPosition + aSp2.horizontalScrollPosition/2 ;
            //aSp2.verticalScrollPosition = aSp2.verticalScrollPosition + aSp2.verticalScrollPosition/2;

            aSp2.update();
            zoomCounter = zoomCounter - 1;
            }
        }
        if(zoomCounter == 5){
            aSp2.content.scaleX = 1;
            aSp2.content.scaleY = 1;

            aSp2.content.y = 0;


            aSp2.update();
            zoomCounter = 4;
        }

        trace("Zoom IN Count = "+zoomCounter);
    }else{
        if(zoomCounter == 4){
            scaleAmt = 1920/aSp2.content.width;

            aSp2.content.scaleX = scaleAmt;
            aSp2.content.scaleY = scaleAmt;

            aSp2.content.y = 520-(aSp2.content.height/2);


            aSp2.update();
            zoomCounter = 5;

        }
        if(zoomCounter < 4){

            aSp2.content.scaleX -= 1.1;
            aSp2.content.scaleY -= 1.1;
            aSp2.update();
            zoomCounter = zoomCounter + 1;
        }

        trace("Zoom OUT Count = "+zoomCounter);
    }


}

person Justgrant2009    schedule 06.06.2014    source источник


Ответы (1)


Волшебное слово, которое вы ищете, это "Pivot" (в AS3 называется "точка регистрации").

Но здесь у нас есть самый быстрый способ сделать это: Вы должны поместить свое изображение в контейнер Sprite.

function reposition():void{
 var changex:Number=(container.x-zoomPt.x)/container.scaleX;
 var changey:Number=(container.y-zoomPt.y)/container.scaleX;
 container.x=zoomPt.x;
 container.y=zoomPt.y;
  for(var i:int=0;i<container.numChildren;i++){
      container.getChildAt(i).x+=changex;
      container.getChildAt(i).y+=changey;
   }
}

Полное руководство находится здесь.

person SharpEdge    schedule 06.06.2014