Flex GestureZoom не работает должным образом определенной области - PullRequest
0 голосов
/ 22 февраля 2012

Я попытался увеличить и уменьшить масштаб для Android Mobile, используя transformGestureEvent.GESTURE_ZOOM, но он не масштабируется должным образом, потому что он всегда масштабирует только центральную точку, а не точно между двумя пальцами в пределах содержимого (определенной области).

Я пробовал ниже 3 функции образца для увеличения и уменьшения масштаба

        1.  private function onZoom(e:TransformGestureEvent):void/* not working properly  */
        {
            swfLoader.scaleX *= e.scaleX;
            swfLoader.scaleY *= e.scaleY;
        }
        2. private function onZoom(e:TransformGestureEvent):void/* not working properly  */
        {
            swfLoader.scaleX *= (e.scaleX+e.scaleY)/2;
            swfLoader.scaleY *= (e.scaleX+e.scaleY)/2;
        }3. private function onZoom(e:TransformGestureEvent):void
        {
            // scale the view
            swfLoader.scaleX *= e.scaleX;
            swfLoader.scaleY *= e.scaleY;

            var bounds2:Rectangle = swfLoader.content.getBounds(swfLoader.stage);
            var dx:Number = bounds2.x - bounds1.x;
            var dy:Number = bounds2.y - bounds1.y;
            var dw:Number = bounds2.width - bounds1.width;
            var dh:Number = bounds2.height - bounds1.height;

            // move the view to keep it centered while zooming
            swfLoader.x -= dx + dw/2;
            swfLoader.y -= dy + dh/2; 

        }<s:BorderContainer id="contentPanel" width="100%" height="100%" backgroundColor="#cccccc" >
    <s:Scroller id="scroller" width="100%" height="100%"   >
                <s:VGroup id="swfloadergroup" width="100%" height="100%"  horizontalAlign="center" verticalAlign="middle"  >

                <s:SWFLoader id="swfLoader" smoothBitmapContent="true"  autoLoad="true" doubleClickEnabled="true"
                             maintainAspectRatio="true" gestureZoom="onZoom(event)" scaleContent="true" loadForCompatibility="true"  />

                <s:SWFLoader id="preLLoader" autoLoad="true"  width="30%" height="30%"
                             source="@Embed('assets/loading.swf')"
                             maintainAspectRatio="true" scaleContent="true "/>
                </s:VGroup> 

    </s:Scroller>
</s:BorderContainer>

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

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

TransformGestureEvent имеет свойства localX и localY, которые содержат координаты центра между двумя пальцами.

Хотя вы не можете масштабировать объект из нецентральной точки, не перемещая его, поэтому только с помощью масштабирования можно перемещать даже «неподвижный» объект.Чтобы жест выглядел естественно, сначала нужно переместить спрайт на разницу между позициями, а затем увеличить его из определенной точки.

Вам понадобятся oldLocalX и oldLocalY, чтобы сохранить старые координаты.Установите эти переменные на текущий localX / localY, когда gesture.phase == GesturePhase.BEGIN.После этого переместите ваш спрайт на новую дельту.

Чтобы увеличить объект из определенной точки, сделайте следующее:

var matrix:Matrix = this.transform.matrix;
matrix.translate(-event.localX, -event.localY);
matrix.scale(event.scaleX, event.scaleY);
matrix.translate(event.localX, event.localY);
this.transform.matrix = matrix;
0 голосов
/ 23 февраля 2012

Я понял.когда я пытался увеличить определенную область, я использовал код ниже для этого.Работает но не прокручивает.

 Mtransform = swfLoader.content.transform.matrix; 
            Mtransform.translate( -originX, -originY );
            Mtransform.scale( scale, scale );
            Mtransform.translate( originX, originY );
            swfLoader.content.transform.matrix = Mtransform;
...