Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Zoom indisciplinato

  1. #1

    Zoom indisciplinato

    ciao,

    dopo svariati tentativi, sono riuscita a creare uuno zoom su un immagine draggabile. Funziona tutto correttamente tranne che una cosa. Lo zoom agisce correttamente solo la prima volta che viene cliccato. Mi spiego: dopo lo zoomout per effettuare nuovamente uno zoom è necessario dover tenere preputo il click del mouse e non voglio assolutamente ch esi così!
    Va be, mi sa che non mi sono spiegata tanto bene e quindi vi allego il codice.
    Grazie


    function dragZoom(movieClip) {

    _global.homeX = 500;
    _global.homeY =400;

    _global.zoomIncrement =20;

    _global.zoomAmount =400;


    function zoomIn(movieClip) {

    if(movieClip._yscale && movieClip._xscale < zoomAmount) {

    movieClip._xscale = movieClip._xscale + zoomIncrement;
    movieClip._yscale = movieClip._yscale + zoomIncrement;

    }

    }

    function zoomOut(movieClip) {

    if(movieClip._yscale && movieClip._xscale > 140) {

    movieClip._xscale = movieClip._xscale - zoomIncrement;
    movieClip._yscale = movieClip._yscale - zoomIncrement;

    }

    }
    movieClip.onMouseDown = function() {
    if (this.hitTest (_xmouse,_ymouse)){

    this.startDrag();

    movieClip.onEnterFrame = function() {

    zoomIn(this);

    }
    }



    movieClip.onRelease = function() {

    this.stopDrag();

    movieClip.onEnterFrame = function() {

    zoomOut(this);

    image._x = image._x - (image._x - homeX) / 5;
    image._y = image._y - (image._y - homeY) / 5;

    }

    }

    }
    }

    dragZoom(image);

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao..

    Un consiglio: Quando posti dello script sul forum utilizza i relativi tag di formattazione.. [ code ] [ /code ], renderà più leggibile il messaggio.

    Riguardo il tuo problema ci sarebbero da rivedere un po' di cose.. :master:

    Lo script è un pochino "contorto" e il procedimento logico che hai utilizzato è poco chiaro.. ho provato a modificare qualcosa per fargli fare ciò che hai chiesto.. ad un certo punto sembrava funzionasse ma ogni tanto si ripresentava il problema in modo simile..
    Risultato: bisogna rivedere tutto lo script e cercare di ottimizzarlo seguendo un ragionamento logico.

    Se spieghi esattamente come vuoi che si comporti posso tentare di aiutarti.

    Facciamo una lista di come dovrebbe funzionare:
    1. Si ha un clip sullo stage con delle dimensioni al 100%.. giusto?
      Chiedo conferma perché nella condizione della funzione zoomOut hai impostato come limite 140.. Infatti quando il clip si ridimensiona torna a 140..
    2. La posizione del clip dovrebbe essere stata impostata precedentemente e teoricamente dovrebbe corrispondere a homeX, homeY.. giusto?
    3. Cliccando sul clip deve avvenire automaticamente l'animazione per lo zoomIn e allo stesso tempo inizia il trascinamento del clip.
    4. Se si rilascia il mouse durante il fadeIn, l'animazione non dovrebbe interrompersi ma deve proseguire fino a quando il clip raggiunge dimensioni 400% (valore indicato dalla variabile zoomAmount), e deve continuare anche il trascinamento.
    5. Se durante il fadeIn si è tenuto premuto il mouse e lo si rilascia dopo l'animazione, non dovrebbe accadere niente ed il trascinamento deve continuare.
    6. Una volta avvenuto il fadeIn, e il mouse è rilasciato, bisogna cliccare e rilasciare nuovamente il mouse per far avvenire il fadeOut e bloccare il trascinamento del clip.
    7. Col fadeOut il clip dovrebbe andare alla posizione homeX, homeY e riportarsi alla dimensione 100% (o eventualmente 140)


    Dimmi se il procedimento è questo o eventualmente correggi i punti sbagliati, e vediamo come ottimizzare il tutto.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Il codice è unpo' ingarbigliato perchè non sono molto pratica di AS e lavoro con quel poco che so e vari copia e incolla.
    Mi sembra comunque che tu abbia capito bene qual'è il mio obiettivo. Anche se il massimo per me sarebbe farlo in questo modo: http://www.erwinolaf.com.

    Grazie mille

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    In effetti con il link di esempio si capisce di più cosa vuoi fare..

    La funzionalità è leggermente diversa da quella del tuo script.

    Nota che sia per lo zoomIn, sia per lo zoomOut deve avvenire un evento Release, ovvero bisogna premere e quindi rilasciare il mouse per fare in modo che avvenga lo zoom..

    Mentre nel tuo script lo zoom avviene al momento della pressione, questo in effetti complica le cose perché non si riesce a gestire bene gli eventi..

    Se vuoi posso provare ad elaborare un qualcosa di più simile al link che hai indicato.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    Magari!!!! Anche perchè temo che io continuerei a fare dei danni...

  6. #6
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Eccoci

    Scusa per il ritardo.. pensavo fosse più semplice.. ma per avere un effetto funzionale e valido ho dovuto provare e riprovare..
    Non vorrei vantarmi ma credo sia anche meglio di quello del link che hai indicato

    Se comunque avevi già risolto, tanto meglio per te..
    Ad ogni modo posto lo scriptino che ho sviluppato, potrebbe sempre tornare utile a qualcuno.

    Copia è incolla sul primo frame.
    Nell'ultima riga, al posto di "clip" dovrai indicare la tua istanza a cui vuoi assegnare la funzione di zoom.

    Per funzionare in modo corretto, il contenuto del tuo clip dovrà essere disposto in modo che il punto di riferimento risulti esattamente in alto a sinistra.

    Potrai inoltre impostare i 3 parametri all'inizio dello script.

    La funzione zoom agirà sul clip creando un'animazione durante lo zoom e permettendo uno scorrimento se sborda oltre l'area visibile.. nel caso in cui il clip ingrandito rimanga comunque più piccolo dell'area visibile, questo sarà sempre posizionato al centro dello stage, evitando scorrimenti inconsueti.
    Il calcolo del posizionamento per lo scorrimento è ottenuto in base all'effettiva area visibile, ovvero tiene conto dell'eventuale ridimensionamento del flashplayer..

    Tutto il codice è commentato.
    Se comunque incontri problemi fammi sapere.



    Codice PHP:
    // wbdZoom by KillerWorm
    // ------------------- PARAMETRI PER LO ZOOM -------------------
    // fattore massimo di zoom
    var maxzoom 5;
    // velocità animazione (da 0 a 100)
    var vel 10;
    // margine dai limiti dello stage, per il clip al massimo zoom
    var mrg 20;
    // -------------------------------------------------------------
    //
    // dimensioni iniziali dello stage 
    var osw Stage.width;
    var 
    osh Stage.height;
    //
    function zoom() {
        
    // puntatore del clip su cui agisce la funzione zoom
        
    var mc this;
        
    // imposto i riferimenti alle proprietà iniziali del clip se non sono ancora impostati
        
    (!mc.ox) && (mc.ox=mc._x);
        (!
    mc.oy) && (mc.oy=mc._y);
        (!
    mc.ow) && (mc.ow=mc._width);
        (!
    mc.oh) && (mc.oh=mc._height);
        (!
    mc.xs) && (mc.xs=mc._xscale);
        (!
    mc.ys) && (mc.ys=mc._yscale);
        
    // valore iniziale di incremento animazione zoom
        
    (!mc.inc) && (mc.inc=0);
        
    // posizione che il clip deve raggiungere al massimo zoom
        
    var endx mc.zoomed mc.xs kzoom*mc.xs;
        var 
    endy mc.zoomed mc.ys kzoom*mc.ys;
        
    // stato di zoom del clip
        
    mc.zoomed = !mc.zoomed;
        
    // elimino intervallo per animazione zoom
        
    clearInterval(mc.z);
        
    delete mc.onMouseMove;
        
    // direzione dell'animazione
        
    var dir Number(mc.zoomed)*2-1;
        
    // funzione per l'animazione zoom, richiamata dall'intervallo
        
    var zooming = function () {
            
    // aggiorno valore di incremento rispetto ai valori vel e dir, e limitandolo tra 0 e 100
            
    mc.inc Math.max(0Math.min(mc.inc+vel*dir100));
            
    // valore sinusoidale relativo al valore inc (serve a dare un andamento più morbido all'animazione)
            
    var = (1+Math.sin((-90+mc.inc*1.8)*Math.PI/180))/2;
            
    // aggiorno la dimensione del clip
            
    mc._xscale mc.xs+k*(mc.xs*(maxzoom-1));
            
    mc._yscale mc.ys+k*(mc.ys*(maxzoom-1));
            if (
    mc.inc>&& mc.inc<100) {
                
    // aggiorno la posizione del clip durante l'animazione zoom
                
    moving(k);
            } else {
                
    // altrimenti elimino intervallo per animazione zoom
                
    clearInterval(mc.z);
                
    moving(k);
                
    // se il clip è al massimo zoom
                
    (mc.inc == 100) && (mc.onMouseMove=function () {
                    
    // aggiorno la posizione del clip solo al movimento del mouse
                    
    moving(k);
                    
    updateAfterEvent();
                });
            }
        };
        
    // funzione per il movimento del clip ingrandito
        
    var moving = function (k) {
            
    // calcolo la differenza tra le dimensioni originali dello stage e le dimensioni dell'area visibile effettiva
            
    var dx = (Stage.width-osw)/2;
            var 
    dy = (Stage.height-osh)/2;
            
    // calcolo la posizione finale del clip al massimo zoom, posiziona al centro se è più piccolo dell'area visibile
            
    var zx = (maxzoom*mc.ow+mrg*2>Stage.width) ? (mrg-dx+(_root._xmouse+dx)/Stage.width*(Stage.width-maxzoom*mc.ow-mrg*2)) : ((osw-maxzoom*mc.ow)/2);
            var 
    zy = (maxzoom*mc.oh+mrg*2>Stage.height) ? (mrg-dy+(_root._ymouse+dy)/Stage.height*(Stage.height-maxzoom*mc.oh-mrg*2)) : ((osh-maxzoom*mc.oh)/2);
            
    // aggiorno la posizione del clip in base allo zoom corrente
            
    mc._x mc.ox*(1-k)+zx*k;
            
    mc._y mc.oy*(1-k)+zy*k;
        };
        
    // intervallo per animazione zoom
        
    mc.setInterval(zooming30);
        
    // prima chiamata della funzione per l'animazione zoom
        
    zooming();
    }
    // richiamo la funzione zoom al click sull'istanza
    clip.onRelease zoom
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  7. #7
    Sei fantastico!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.