Увеличение и уменьшение масштаба с помощью AS3 - PullRequest
3 голосов
/ 08 апреля 2010

вы все знаете: «щелкнуть правой кнопкой мыши -> увеличить или уменьшить» во флэш-файле, ну, мне нужно сделать это, но, например, нажав кнопку.

Возможно ли это, используя только код AS3?

Thx!

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

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

0 голосов
/ 15 марта 2013

На самом деле, если вы хотите масштабировать / увеличивать / уменьшать масштаб сцены или видеообъекта или чего-либо еще, вместо этого следует использовать умножение и деление. Вот так (это то, что я использовал, когда мне нужно было создать функцию масштабирования / масштабирования для веб-камеры - цифровой зум, конечно, с использованием функции масштабирования):

Предположим, что:


video_width = 640;
video_height = 480;

stage.scaleMode     = StageScaleMode.NO_SCALE; 
stage.align         = StageAlign.TOP_LEFT;
stage.stageWidth    = video_width;
stage.stageHeight   = video_height;


camera = Camera.getCamera();
// some other params

video = new Video( video_width, video_height );
video.attachCamera(camera);
addChild(video);

// to mirror webcam output:
video.scaleX = -1;
video.scaleY = 1;
video.x = video_width;
video.y = 0;


public function zoom(action:String = 'reset')
{
      var step = 1.1, // adjust this multiplyer for faster zoom. Eg. 1.2, 1.5, etc.
          x_offset = 0, 
          y_offset = 0;

    if (action == 'in')
    {
        video.scaleX *= step;
        video.scaleY *= step;

        x_offset = (stage.stageWidth - video.width)/2;
        y_offset = (stage.stageHeight - video.height)/2;
                // to center video object on stage by X if mirror effect is used
        video.x = stage.stageWidth - x_offset; 
                // to center video object on stage by X - no mirror
                // video.x = x_offset;
        video.y = y_offset; // to center video object on stage by Y
    }
    else if (action == 'out')
    {
            video.scaleX /= step;
        video.scaleY /= step;

        x_offset = (stage.stageWidth - video.width)/2;
        y_offset = (stage.stageHeight - video.height)/2;
        video.x = stage.stageWidth - x_offset;
        video.y = y_offset;
    }
    else
    {
                // need to be mirrored
        video.scaleX = -1; 
                // no mirror
                 // video.scaleX = 1;
        video.scaleY = 1;
                // if mirror video output
        video.x = stage.stageWidth;
               // no mirroring used
               // video.x = 0;
        video.y = 0;
    }       
}

Теперь вы используете это, прикрепляя эти функции к вашим кнопкам:


zoom('in');
zoom('out'); 
zoom('reset'); // reset zoom
0 голосов
/ 13 июня 2010

Я бы также использовал scaleX и scaleY, но просто с числом вместо решения Джорджа с var. Итак, что-то вроде

zoomInButton.addEventListener(MouseEvent.MOUSE_DOWN, zoomIn);
zoomOutButton.addEventListener(MouseEvent.MOUSE_DOWN, zoomOut);

function zoomIn(e:MouseEvent) {
  //actions for zoom-in function
  myPicture.scaleX += 10;
  myPicture.scaleY += 10;
}
function zoomOut(e:MouseEvent) {
  //actions for zoom-out function
  myPicture.scaleX += 10;
  myPicture.scaleY += 10;
}

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

function zoomIn(e:MouseEvent) {
  //actions for zoom-in function
  myPicture.scaleX += 10;
  myPicture.scaleY += 10;
  myPicture.x -= 5;
  myPicture.y -= 5;
}
0 голосов
/ 08 апреля 2010

Не так, как я знаю. Хотелось бы увидеть другие ответы.

Одна хакерская вещь, которая приходит на ум, может быть, вы могли бы использовать JavaScript управлять div, содержащим ваш swf, чтобы div становился большим (увеличение), но отображается в том же прямоугольнике scrollRect. Вы бы назвали Функция JavaScript, чтобы сделать это, используя ExternalInterface.

Быстрый и грязный тест, который я сделал с использованием компонента scrollPane во флэш-памяти:

//zoomIn,zoomOut = button
//sp = scrollPane, scrollDrag = true
zoomIn.addEventListener(MouseEvent.CLICK, zoom);
zoomOut.addEventListener(MouseEvent.CLICK, zoom);

function zoom(event:MouseEvent) {
    var scale:Number = event.currentTarget == zoomIn ? 1 : -1;
    sp.content.scaleX += scale;
    sp.content.scaleY += scale;
    sp.update();
}

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

НТН, George

...