Panel de zoom de imágenes en Flex

April 13th, 2009 | 3 Comments | Posted in AS3, Básico, Flex

Este ejemplo es, igual que hice en el post anterior, un ejemplo que he adaptado a Flex desde un ejemplo que hice hace tiempo para Flash. Se trata de un panel donde se ve un zoom de una parte de una imagen.

Este es el ejemplo montado en Flex:

Y este es el código utilizado para la película principal:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                xmlns:ui="*"
                layout="absolute"
                creationComplete="ini()"
                width="505"
                height="260">

    <mx:Script>
        <![CDATA[
            import ZoomFx;
            private var _zoom:ZoomFx;

            private function ini():void
            {
                _zoom=new ZoomFx(this, fotoZoom, panelZoom);
            }
        ]]>
    </mx:Script>

    <mx:HBox horizontalCenter="0"
             verticalCenter="0">
        <ui:FotoZoom id="fotoZoom"/>
        <ui:PanelZoom id="panelZoom"/>
    </mx:HBox>

</mx:Application>

Este sería el componente que contiene la foto en grande:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
           width="350"
           height="250"
           borderStyle="solid"
           borderThickness="1"
           borderColor="#000000"
           horizontalScrollPolicy="off"
           verticalScrollPolicy="off">
    <mx:Image id="foto"
              scaleContent="false">
        <mx:source>img/Waterfall.jpg</mx:source>
    </mx:Image>

</mx:Canvas>

Y este el componente que contiene el panel de preview:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
           width="140"
           height="100"
           borderStyle="solid"
           borderThickness="1"
           borderColor="#000000"
           horizontalScrollPolicy="off"
           verticalScrollPolicy="off">
    <mx:Image id="foto"
              scaleContent="true"
              width="140"
              height="100"
              horizontalCenter="0"
              verticalCenter="0">
        <mx:source>img/Waterfall.jpg</mx:source>
    </mx:Image>
    <mx:Canvas x="0"
               y="0"
               width="70"
               height="50"
               backgroundColor="#FF0000"
               backgroundAlpha="0.5"
               borderStyle="solid"
               borderThickness="1"
               borderColor="#FF0000"
               id="zoomDrag">
    </mx:Canvas>
</mx:Canvas>

Solo quedaría la clase de que controla el efecto:

package
{
    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.containers.Canvas;
    import mx.controls.Image;
    import mx.controls.Alert;
    import mx.core.UIComponent;

    public class ZoomFx
    {
        private var _stage:UIComponent;
        private var _fotoZoom:UIComponent;
        private var _panelZoom:UIComponent;
        private var _distX:Number;
        private var _distY:Number;
        private var _porcentajeX:Number;
        private var _porcentajeY:Number;

        //----------------------------------------------------
        public function ZoomFx(stage:UIComponent, fotoZoom:UIComponent, panelZoom:UIComponent)
        {
            _stage=stage;
            _fotoZoom=fotoZoom;
            _panelZoom=panelZoom;

            iniZoomDrag();
        }

        private function iniZoomDrag():void
        {
            var drag:Canvas=_panelZoom.getChildByName("zoomDrag") as Canvas;
            drag.addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
            drag.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
            drag.addEventListener(MouseEvent.MOUSE_OUT, onStopDrag);
        }

        private function onStartDrag(e:Event):void
        {
            var canvas:Canvas=e.target as Canvas;
            canvas.startDrag();
            _stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseDragMove);
        }

        private function onStopDrag(e:Event):void
        {
            var canvas:Canvas=e.target as Canvas;
            canvas.stopDrag();
            _stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseDragMove);
        }

        private function onMouseDragMove(e:Event):void
        {
            calculaDist();
            mueveVisorZona();
            controlaPosiciones();
        }

        //-------------------------------------------------------------
        private function calculaDist():void
        {
            var drag:Canvas=_panelZoom.getChildByName("zoomDrag") as Canvas;
            var foto:Image=_fotoZoom.getChildByName("foto") as Image;

            _porcentajeX=100 / (foto.width / _panelZoom.width);
            _porcentajeY=100 / (foto.height / _panelZoom.height);

            drag.width=_fotoZoom.width * _porcentajeX / 100;
            drag.height=_fotoZoom.height * _porcentajeY / 100;

            _distX=drag.x * 100 / _porcentajeX;
            _distY=drag.y * 100 / _porcentajeY;

            _distX=(_distX <0) ? 0 : _distX;
            _distY=(_distY <0) ? 0 : _distY;
        }

        private function mueveVisorZona():void
        {
            var drag:Canvas=_panelZoom.getChildByName("zoomDrag") as Canvas;
            var foto:Image=_fotoZoom.getChildByName("foto") as Image;
            foto.x=-_distX;
            foto.y=-_distY;
        }

        private function controlaPosiciones():void
        {
            var drag:Canvas=_panelZoom.getChildByName("zoomDrag") as Canvas;
            var foto:Image=_fotoZoom.getChildByName("foto") as Image;

            if (drag.x <0)
            {
                drag.x=0;
            }
            else if (drag.x> _panelZoom.width - drag.width)
            {
                drag.x=_panelZoom.width - drag.width;
            }
            if (drag.y <_panelZoom.y)
            {
                drag.y=_panelZoom.y;
            }
            else if (drag.y> _panelZoom.y + _panelZoom.height - drag.height)
            {
                drag.y=_panelZoom.y + _panelZoom.height - drag.height;
            }

            if (foto.x> 0)
            {
                foto.x=0;
            }
            else if (foto.x <_fotoZoom.width - foto.width)
            {
                foto.x=_fotoZoom.width - foto.width;
            }
            if (foto.y> 0)
            {
                foto.y=0;
            }
            else if (foto.y <_fotoZoom.height - foto.height)
            {
                foto.y=_fotoZoom.height - foto.height;
            }
        }

    }
}

Comparte:
  • Meneame
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Technorati
  • email
  • Print
Tags: , , ,

Asignar una clase ActionScript 3 a un itemRenderer en Flex

March 3rd, 2009 | 1 Comment | Posted in AS3, Class, Flex

En este Tip voy a explicar un sistema para poder controlar la funcionalidad de un componente usado como itemRenderer en cualquier componente de tipo lista desde una clase de ActionScript 3.

Supongamos que en nuestra aplicación Flex tenemos un compomente TileList al que le hemos asignado otro componente como itemRenderer:

<mx:TileList id="myTileList">   
    <mx:itemRenderer>
        <mx:Component>         
            <mx:myItemRenderer/>
        </mx:Component>
    </mx:itemRenderer>
</mx:TileList>

Este itemRenderer será otro archivo MXML al que queremos asignarle una clase AS3 para poder manejarlo, para ello le añadiremos un tag y definiremos la clase:

<mx:Script>
    <![CDATA[
        import com.proyecto.MyItemRendererClass;
        private var _this:MyItemRendererClass = new MyItemRendererClass(this);
    ]]>
</mx:Script>

El único detalle a tener en cuenta es que la clase reciba correctamente el contenido del objeto "data" del dataProvider. Eso se lo tenemos que pasar una vez el itemRenderer esté creado, de manera que en el evento creationComplete del componente haremos un setter a la clase:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"creationComplete="_this.data = data">

Con lo que la clase para controlar el itemRenderer comenzaría siendo así:

package com.proyecto
{
    public class MyItemRendererClass
    {
        private var _main:Object;
        private var _data:Object;
        //------------------------------------------------------------------------
        public function MyItemRendererClass(m:Object)
        {
            _main = m;
        }   
        public function set data(d:Object):void
        {
            _data = d;
            init();
        }
        //------------------------------------------------------------------------
        public function init():void
        {
            /* etc.. */
        }
        //------------------------------------------------------------------------
    }
}

Comparte:
  • Meneame
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Technorati
  • email
  • Print
Tags: , ,