1. #1
    Ext User
    Join Date
    Aug 2010
    Posts
    1
    Vote Rating
    0
    jgdev is on a distinguished road

      0  

    Default Start zoomed-out with pinch-to-zoom

    Start zoomed-out with pinch-to-zoom


    I have successfully gotten the pinch-to-zoom functionality working for an image in my app, but when the app is loaded, the image starts out too big to fit on the screen (normal size). Is there a way to have the image start zoomed out so that the whole this is visible and then the user can pinch to zoom in to get it back to the "normal" size? I don't want to make the image smaller because then it might not have enough detail when zoomed-in all the way.

  2. #2
    Sencha - Ext JS Dev Team evant's Avatar
    Join Date
    Apr 2007
    Location
    Sydney, Australia
    Posts
    17,168
    Vote Rating
    674
    evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute

      0  

    Default


    Modify it at runtime:

    Code:
    Ext.setup({
        onReady: function(){
            new Ext.Panel({
                fullscreen: true,
                html: '<img src="..." />',
                afterrender: function(c){
                    var dimensions = c.getSize();
                    c.el.select('img').setSize(c.width, c.height);
                }
            });
        }
    });
    Evan Trimboli
    Sencha Developer
    Twitter - @evantrimboli
    Don't be afraid of the source code!

  3. #3
    Touch Premium Member jeffcrilly's Avatar
    Join Date
    May 2008
    Posts
    89
    Vote Rating
    0
    jeffcrilly is on a distinguished road

      0  

    Default


    Quote Originally Posted by evant View Post
    Modify it at runtime:

    Code:
    Ext.setup({
        onReady: function(){
            new Ext.Panel({
                fullscreen: true,
                html: '<img src="..." />',
                afterrender: function(c){
                    var dimensions = c.getSize();
                    c.el.select('img').setSize(c.width, c.height);
                }
            });
        }
    });
    In the above code snippet... is the setSize(c.width, c.height) correct? Shouldn't dimensions be used here? E.g...

    Code:
                   
    var dimensions = c.getSize();
    c.el.select('img').setSize(dimensions.width, dimensions.height);
    (am I missing something?)

    thx

  4. #4
    Sencha - Ext JS Dev Team evant's Avatar
    Join Date
    Apr 2007
    Location
    Sydney, Australia
    Posts
    17,168
    Vote Rating
    674
    evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute evant has a reputation beyond repute

      0  

    Default


    Yeah, typo.
    Evan Trimboli
    Sencha Developer
    Twitter - @evantrimboli
    Don't be afraid of the source code!

  5. #5
    Sencha Premium Member
    Join Date
    Sep 2008
    Posts
    710
    Vote Rating
    6
    Bucs is on a distinguished road

      0  

    Default


    @Jeff, were you able to get this molded into a workable solution, where you could pinch, zoom, and move around an image? I have a big project that needs this and would love to hear if you were able to implement this and if so, how you did it.

    Thanks!

  6. #6
    Sencha User
    Join Date
    Apr 2010
    Location
    Arizona High Desert USA
    Posts
    15
    Vote Rating
    0
    UltimateCodeWarrior is an unknown quantity at this point

      0  

    Post Sencha Touch Pinch Zoom Example Code (Slightly Buggy -- Needs some expert advice)

    Sencha Touch Pinch Zoom Example Code (Slightly Buggy -- Needs some expert advice)


    Code:
     <!-- 
       4/10/2011
       
       This is my best effort at a Sencha Touch pan / pinch zoom in/out on images.
       It is far from flawless.
       
       This example code has been cobbled together from many other examples. 
       (Thanks to the internet community for sharing their knowledge.
        In like manner,  I post this to help the next guy!)
     
     Notes on use:
        5 minute setup:  Download Sencha Touch Libraries Locally.
        You will need to supply your own images, in the image_array.
        Would be good to use images greater than your monitor/display size.
        Adjust MAX_IMAGE to the count of these images.
        You will need to supply your own ZoomIn / ZoomOut Icons Classes
        The "1-0.gif" in the div tag at the bottom is a loading animated icon.  
        Also, you will need to point the sencha touch libraries at your own local copy.
        
    What doesn't work so well:
     
       -Some Orientations on Ipad/Android clip the bottom toolbar off.  
      - Android running on a 1st Generation Droid doesn't seem to support pinch.
      - Android on a new HTC Thunderbolt does it's own thing with a pinch to zoom. 
       Like shrink the whole webpage.
     
     - Images are not centered in the panel area.  Would be nice to have them centered.
       I could get the centered image zoom to work, but not the panning because of CSS 
       offset issues.
    
      -Google Chrome is a bit Funky to Pan, Click and Drag to start the pan. Then Release the 
       Mouse button.  Then drag the mouse around and you will see the image pan.  Then Click 
       The Mouse to Stop.  Clunky yes. Chrome has a funky way of handling the touch move events.
       
       If anyone has the fix to any of the above mentioned items, would love to hear about it:
       Email To : shanechambers -at- earthlink d o t net
       I'll send you the compiled fixes if I get any word back.
        
    -->
    
     
     <!DOCTYPE HTML> 
     <html> 
     <head> 
     <meta http - equiv = "Content-Type" content = "text/html; charset=utf-8" > 
         <title>Pan Pinch Zoom Example </title> 
         <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> 
        <style type="text/css">
        .zoomIn {
                background-image:url(icons/ZoomIn.png) !important;
         }
        .zoomOut {
          background-image:url(icons/ZoomOut.png) !important;
        }
     
    div.spanInfo {
     
         position:absolute;  
         width:180px;
         height:150px;
         top:10px;
         right:10px;  
         padding:5px;
         background:#FFFFFF;  
         border:2px solid #2266AA;  
         font-size:8px;
       //  display: none;    //This hides the event display
         z-index:200;
    }
    
      div.viewport {
            overflow: hidden:
            position: relative;
            background-color: black;
        }
    
        img.clipped {
            display: block;
            position: absolute;
        }
    
         </style>
         <link rel = "stylesheet" type = "text/css" href = "lib/touch/resources/css/apple.css"/> 
         <script type = "text/javascript" src = "lib/touch/sencha-touch.js"></script> 
          <script type = "text/javascript"> 
    
    
    function initApp() {
     var TOP_BOTTOM_TB_HEIGHT = 94;
     
    var extendedPanel; // This is the Ext JS Mobile Panel 
    var imageIdx = 0; // Current image index
    var currentImageObj;
    
    var MAX_IMAGE = 4; // max images
    var imageCtr = 0; // # loaded
    var span;
    var image_array = new Array();
    image_array[0] = "c4p1.jpg";
    image_array[1] = "c3p1.gif";
    image_array[2] = "c2p1.jpg";
    image_array[3] = "c1p1.jpg";
    
    var image_width = new Array();
    var image_height = new Array();
    
    var scaleImageMultiplier = 0.0; // This is how the image will be set
    
    ///// Touch Variables, when the touch is started.
    var startX;
    var startY;
    
    // Original Image Offset, from the image to allow for stop and go panning.
    
    var offX;
    var offY;
    
    function setViewport(x, y, width, height) {
        currentImageObj.style.left = "-" + x + "px";
        currentImageObj.style.top = "-" + y + "px";
        
        if (width !== undefined) {
            currentImageObj.parentNode.style.width = width + "px";
            currentImageObj.parentNode.style.height = height + "px";
        }
        extendedPanel.doLayout();
    }
    
    function stripPX(str) {
        str = str.replace("p", "");
        str = str.replace("x", "");
        //str = str.replace("-","");
     
        return parseInt(str);
     
    }
    
    function setViewportDelta(x, y) {
        
        x = x + Math.abs(offX);
        y = y + Math.abs(offY);
     
        currentImageObj.style.left = "-" + x + "px";
        currentImageObj.style.top = "-" + y + "px";
        
    }
    
    function setImage() {
        
        var panelWidth = extendedPanel.getWidth();
        var panelHeight = extendedPanel.getHeight();
        var adjPanelHeight = panelHeight - TOP_BOTTOM_TB_HEIGHT; // Minus Toolbar top and boottom
        
        var imageWidth = image_width[imageIdx];
        var imageHeight = image_height[imageIdx];
        
        // Initially, we want the image to fill as much as the screen
        // as we can.    So we have to look at the panel width and height
        // and the image width and height and choose our dimensions.  
        var divWidth;
        var divHeight;
        
        // Top toolbar = 47 pix, bottom = 47 pix = 94 pix
     
        /* First, we must calculate a multiplier that will be used
        * to get the dimensions of the new, scaled image.
        *  This multiplier is defined as the ratio of the
        * Desired Dimension to the Current Dimension.
        * Specifically which dimension is used depends on the larger
        * dimension of the image, as this will be the constraining dimension
        * when we fit to the window.
        */
        
        /* Determine if Image is Portrait or Landscape. */
        if (imageHeight > imageWidth) {
            /* Image is Portrait */
            /* Calculate the multiplier based on the heights. */
            if (adjPanelHeight > panelWidth) {
                scaleImageMultiplier = panelWidth / imageWidth;
            } else {
                scaleImageMultiplier = adjPanelHeight / imageHeight;
            }
        } else {
        /* Image is Landscape */
            /* Calculate the multiplier based on the widths. */
            if (adjPanelHeight >= panelWidth) {
                scaleImageMultiplier = panelWidth / imageWidth;
            } else {
                scaleImageMultiplier = adjPanelHeight / imageHeight;
            }
        }
        showScaledImage();
    }
    
    function showScaledImage() {
        var imageWidth = image_width[imageIdx];
        var imageHeight = image_height[imageIdx];
        
            /* Generate and return the new scaled dimensions.
        
        * Essentially, we multiply each dimension of the original image
        * by the multiplier calculated above to yield the dimensions
        * of the scaled image. The scaled image can be larger or smaller
        * than the original.
        */
        
        var divWidth = (imageWidth * scaleImageMultiplier);
        var divHeight = (imageHeight * scaleImageMultiplier);
        
        currentImageObj = document.getElementById("imageId");
        currentImageObj.setAttribute("src", image_array[imageIdx]);
        
        currentImageObj.setAttribute("width", divWidth);
        currentImageObj.setAttribute("height", divHeight);
        // ImageStartX,ImageStartY, viewportWid,viewportHgt
        
        setViewport(0, 0, extendedPanel.getWidth(), extendedPanel.getHeight() - TOP_BOTTOM_TB_HEIGHT);
        
    }
    
    function cacheImage(imgPath, idx) {
        var myImage = new Image();
        myImage.name = imgPath;
        myImage.onload = function (obj) {
            var imgHeight = this.height;
            var imgWidth = this.width;
            //alert('idx: '+idx+' w :'+imgWidth+' h: '+imgHeight);
            image_width[idx] = imgWidth;
            image_height[idx] = imgHeight;
            imageCtr++;
            if (imageCtr == MAX_IMAGE) {
                imageIdx=0;
                setImage();
            }
        };
        myImage.src = imgPath;
    }
        new Ext.Application({
                name : 'MobileApp', // Namespace
                launch : function () { // After Load
                    var findingsOverlayTb = new Ext.Toolbar({
                            dock : 'top'
                        });
                    
                    var findingsOverlay = new Ext.Panel({
                            draggable : true, 
                            floating : true, 
                            modal : true, 
                            centered : false, 
                            width : Ext.is.Phone ? 260 : 400, 
                            height : Ext.is.Phone ? 220 : 400, 
                            styleHtmlContent : true, 
                            dockedItems : findingsOverlayTb, 
                            scroll : 'vertical', 
                            html : 'Findings...'
                        });
                    
                    var showCenteredFindingsOverlay = function (btn, event) {
                        //   diagnosisOverlay.hide();
                        findingsOverlay.setCentered(true);
                        findingsOverlayTb.setTitle('Findings');
                        findingsOverlay.show();
                    };
                    
                    var diagnosisOverlayTb = new Ext.Toolbar({
                            dock : 'top'
                        });
                    var diagnosisOverlay = new Ext.Panel({
                            floating : true, 
                            draggable : true, 
                            modal : true, 
                            centered : false, 
                            width : Ext.is.Phone ? 260 : 400, 
                            height : Ext.is.Phone ? 220 : 400, 
                            styleHtmlContent : true, 
                            dockedItems : diagnosisOverlayTb, 
                            scroll : 'vertical', 
                            html : 'Diagnosis Overlay'
                        });
                    
                    var zoomIn = function () {
                        span.innerHTML += "zoomIn<br/>";
                        scaleImageMultiplier += 0.10;
                        showScaledImage(imageIdx);
                    }
                    
                    var zoomOut = function () {
                        span.innerHTML += "zoomOut<br/>";
                        scaleImageMultiplier -= 0.10;
                        showScaledImage(imageIdx);
                    }
                    
                    var nextSlide = function () {
                        var pi = Ext.getCmp('position_indicator');
                        imageIdx++;
                        if (imageIdx > (MAX_IMAGE - 1)) 
                            imageIdx = 0;
                        pi.setText((imageIdx + 1) + " of " + MAX_IMAGE);
                        setImage( );
                    }
                    
                    var prevSlide = function () {
                        imageIdx--;
                        var pi = Ext.getCmp('position_indicator');
                        if (imageIdx < 0) 
                            imageIdx = (MAX_IMAGE - 1);
                        pi.setText((imageIdx + 1) + " of " + MAX_IMAGE);
                        setImage( );
                    }
                    
                    var showCenteredDiagnosisOverlay = function (btn, event) {
                        // findingsOverlay.hide();
                        diagnosisOverlay.setCentered(true);
                        diagnosisOverlayTb.setTitle('Diagnosis');
                        diagnosisOverlay.show();
                    };
                    
                    MobileApp.ExtendedPanel = Ext.extend(Ext.Panel, {
                            constructor : function () {
                                Ext.apply(this, {
                                        fullscreen : true, 
                                         layout: {
                                          type:'vbox',
                                          pack:'center',
                                          align:'stretch'
                                        },
                                        flex: 1, 
                                        contentEl : 'imageScale', 
                                        monitorOrientation: true,
                                        listeners : {
                                           orientationchange: this.onOrientationChange
                                        },
                                        
                                         onOrientationChange: function(orientation, w, h){
                                         this.doLayout();
                                         setImage();
                                    /*     if(this.orientation == 'portrait') {
                                         alert('portrait');
                                         } else {
                                         alert('landscape');
                                         }*/
     
                                        },
                                        afterrender : function (c) {
                                        }, 
                                        dockedItems : [{
                                                xtype : 'toolbar', 
                                                dock : 'top', 
                                                layout : {
                                                    pack : 'center'
                                                }, 
                                                items : [{
                                                        text : 'prev', 
                                                        ui : 'back', 
                                                        handler : prevSlide
                                                    }, {
                                                        id : 'position_indicator', 
                                                        text : '1 of 4', 
                                                        width : '150'
                                                    }, {
                                                        text : 'next', 
                                                        ui : 'forward', 
                                                        handler : nextSlide
                                                    }
                                                ]
                                            }, {
                                                xtype : 'toolbar', 
                                                // title: 'TOP',
                                                dock : 'bottom', 
                                                layout : {
                                                    pack : 'center'
                                                }, 
                                                
                                                items : [{
                                                        iconMask : true, 
                                                        ui : "plain", 
                                                        
                                                        iconCls : 'zoomIn', 
                                                        handler : zoomIn
                                                    }, {
                                                        iconMask : true, 
                                                        ui : "plain", 
                                                        iconCls : 'zoomOut', 
                                                        handler : zoomOut
                                                    }, {
                                                        text : 'Findings', 
                                                        handler : showCenteredFindingsOverlay
                                                    }, {
                                                        text : 'Diagnosis', 
                                                        handler : showCenteredDiagnosisOverlay
                                                    }
                                                ]
                                            }
                                        ]
                                    }); // Ext.Apply
                                
                                MobileApp.ExtendedPanel.superclass.constructor.apply(this, arguments);
                            }, // Constructor
                            onRender : function (ct, position) {
                                MobileApp.ExtendedPanel.superclass.onRender.call(this, ct, position);
                            }, 
                            afterRender : function () {
                                MobileApp.ExtendedPanel.superclass.afterRender.call(this);
                                
                                this.on('dragend', this.onDragend, this);
                                this.mon(
                                    this.el, {
                                        doubletap : this.onDoubleTap, 
                                        touchmove : this.onTouchmove, 
                                        touchstart : this.onTouchstart, 
                                        touchend : this.onTouchend, 
                                        pinch : this.onPinch, 
                                         pinchend : this.onPinchEnd, 
                                        scope : this
                                    });
                                
                         
                                
                            }, 
                            onTouchstart : function (event, html, obj) {
                                
                                span.innerHTML = "Touch Start";
                                //alert(event.target.className);
                                
                                // Titlebar == 'x-layout-box-inner x-layout-box'
                                // Button = 'x-button x-button-forward x-button-pressed'
                                // x-button-label
                                // x-buton x-button-back x-button-pressed'
                                // zoomIn x-icon-mask
                                // zoomOut x-icon-mask
                                 
                                
                                // if touch on the playground area creat a new box
                                if (
                                    (event.target.className == 'x-panel-body') || 
                                    (event.target.className == '') || 
                                    (event.target.className == undefined) || 
                                    (event.target.className == 'imageScale')||
                                    (event.target.className == 'clipped')) {
                                    
                                    offX = stripPX(currentImageObj.style.left);
                                    offY = stripPX(currentImageObj.style.top);
                                    startX = undefined;
                                    startY = undefined;
                                    
                                    span.innerHTML = 
                                        'Touch Start <br/>' + 
                                        'w: ' + this.getWidth() + ' h: ' + this.getHeight() + '<br />' + 
                                    'x: ' + event.pageX + ' y: ' + event.pageY + '<br />';
                                    'offX: ' + offX + ' offY: ' + offY + '<br />';
                                }
                            }, 
                            addTouchEvents : function () {
                                this.mon(
                                    this.el, {
                                        touchmove : this.onTouchmove, 
                                        touchstart : this.onTouchstart, 
                                        touchend : this.onTouchend, 
                                        pinch : this.onPinch, 
                                         pinchend : this.onPinchEnd, 
                                        scope : this
                                    });
                            }, 
                            removeTouchEvents : function () {
                                this.mun(
                                    this.el, {
                                        touchmove : this.onTouchmove, 
                                        touchstart : this.onTouchstart, 
                                        touchend : this.onTouchend, 
                                        pinch : this.onPinch, 
                                         pinchend : this.onPinchEnd, 
                                        scope : this
                                    });
                            }, 
                            onDoubleTap : function (event, html, obj) {
                                span.innerHTML = "Double Tap";
                            }, 
                            onTouchmove : function (event, html, obj) {
                                var dx = undefined;
                                var dy = undefined;
                                
                                if (!startX) 
                                    startX = event.pageX;
                                else 
                                    dx = startX - event.pageX;
                                
                                if (!startY) 
                                    startY = event.pageY;
                                else 
                                    dy = startY - event.pageY;
     
                                span.innerHTML = 
                                    'Touch Move <br/>' + 
                                    'w: ' + this.getWidth() + ' h: ' + this.getHeight() + '<br />' + 
                                'x: ' + event.pageX + ' y: ' + event.pageY + '<br />' + 
                                'dx:  ' + dx + 'dy: ' + dy + '<br/>';
                                if (dx || dy) {
                                    setViewportDelta(dx, dy);
                                }
     
                            }, 
                            onTouchend : function (event, html, obj) {
                                offX = stripPX(currentImageObj.style.left);
                                offY = stripPX(currentImageObj.style.top);
                                
                                span.innerHTML = 
                                    'Touch End <br/>' + 
                                    'w: ' + this.getWidth() + ' h: ' + this.getHeight() + '<br />' + 
                                'x: ' + event.pageX + ' y: ' + event.pageY + '<br />' + 
                                'offX: ' + offX + ' offY: ' + offY + '<br />';
                                
                            }, 
                            onDragend : function (draggable, event) {
                                span.innerHTML = 
                                    'Drag End <br/>' + 
                                    'w: ' + this.getWidth() + ' h: ' + this.getHeight() + '<br />' + 
                                'x: ' + event.pageX + ' y: ' + event.pageY + '<br />';
                            }, 
                             
                            onPinch : function (e, el, obj) {
                            }, 
                            onPinchEnd : function (e, el, obj) {
                                span.innerHTML = 
                                    'Pinch End<br/>' + 
                                    'w: ' + this.getWidth() + ' h: ' + this.getHeight() + '<br />' + 
                                'x: ' + e.pageX + ' y: ' + e.pageY + '<br />' + 
                                'e.scale: ' + e.scale + '<br>' + 
                                'e.deltaScale: ' + e.deltaScale + '<br>' + 
                                'e.previousScale: ' + e.previousScale + '<br>' + 
                                'e.distance: ' + e.distance + '<br>';
    
                                var iScale = parseInt(e.scale);
                                
                                if (iScale == 0) 
                                    zoomOut();
                                else 
                                    zoomIn();
                            } 
                            
                        }); // Ext.Extend
                    
                    extendedPanel = new MobileApp.ExtendedPanel({
                            title : 'ABC'
                        });
                        
                    span = document.getElementById("span");
                    
                    // Cache Images
                    for (counter = 0; counter < image_array.length; counter++) {
                        cacheImage(image_array[counter], counter);
                    }
                    
                } // constructor
            }); // App
    } // Function
     
     </script> 
     </head> 
     <body onload='initApp()'> 
     
     <!-- This span is for information display, it is hidden, comment out the display:none; if you want to see event info -->
     
     <div id="span"  class="spanInfo">Info</div>
         <div id="imageScale" class="viewport">
            <img id="imageId"  src="1-0.gif" class="clipped" alt="Loading Animation"/> 
         </div>
     </body> 
     </html>

  7. #7
    Sencha User
    Join Date
    May 2011
    Posts
    2
    Vote Rating
    0
    pelkin000 is on a distinguished road

      0  

    Question Equivalent for MVC

    Equivalent for MVC


    None of the examples I find for image pinch/zoom have a ref for MVC style. I am a complete newb to Ext JS and have no idea how to even select the html image tag inside a view once I add it using "html: '<img....'". Here is some code:


    Code:
    initComponent: function() {
    		
    		Ext.apply(this, {
    			html: '<img id="stadmap" src="resources/images/mymap.jpg" style="width: 400px; height: 400px;" />'
    		});
    }
    I am struggling to figure out how I can even select this image in order to add events to it, apply the pinch/zoom code Ive found on a couple of posts, etc. Pleaseeeee point me in the right direction!

  8. #8
    Sencha User
    Join Date
    May 2011
    Posts
    2
    Vote Rating
    0
    pelkin000 is on a distinguished road

      0  

    Default


    bump


    I just want to know how to reference items perhaps by ID (the html kind) or Class (the html kind). Is this possible? If not, whats the point of adding HTML through Sencha, and how else can I add an image and work with it from MVC?

  9. #9
    Sencha User
    Join Date
    Apr 2010
    Location
    Arizona High Desert USA
    Posts
    15
    Vote Rating
    0
    UltimateCodeWarrior is an unknown quantity at this point

      0  

    Default Random Thoughts

    Random Thoughts


    var cmp = Ext.getCmp("stadmap") to a reference to the DOM component?

    You could always put the HTML into a <div id="stadmap"> in your code and use the content-el: stadmap (not sure of the exact syntax) option when configuring that component. That way the HTML loads, the DOM model knows about it's ID, then when Ext JS loads, and you reference it in the javascript code, it knows what DOM element you are referring to.

    Hope that helps you. You might be asking a more advanced question than I can help you with.

Similar Threads

  1. how to include pinch in a Carousel ?
    By ludm in forum Sencha Touch 1.x: Discussion
    Replies: 9
    Last Post: 16 Jan 2012, 5:21 AM
  2. Simulating pinch?
    By Sesshomurai in forum Sencha Touch 1.x: Discussion
    Replies: 2
    Last Post: 22 Sep 2011, 7:23 AM
  3. Pinch to Zoom
    By tobinharris in forum Sencha Touch 1.x: Discussion
    Replies: 3
    Last Post: 19 Jul 2011, 4:14 AM
  4. Is it possible to pinch and zoom a panel or a picture in the html of a panel?
    By achapman in forum Sencha Touch 1.x: Discussion
    Replies: 26
    Last Post: 1 Sep 2010, 6:06 AM
  5. Zoom In/Zoom Out Animation Comments Tutorial and/or Samples
    By Bobafart in forum Ext 1.x: Help & Discussion
    Replies: 2
    Last Post: 29 Dec 2006, 5:36 PM

Thread Participants: 5

Tags for this Thread