2012-12-19 16 views
6

Sto cercando di implementare il movimento fluido delle schede in TChromeTabs. Riesco a vedere le formule di andamento here, ma non sono un matematico e non ho idea di come tradurre questo in codice. I miei tentativi finora non mi hanno portato da nessuna parte.Implementazione delle funzioni EaseIn, EaseOut in Delphi

Sono disponibili implementazioni Delphi delle funzioni di Easing?

+2

È possibile testare i tipi di effetti di attenuazione qui http://gizma.com/easing/ aditionaly ha alcune spiegazioni e alcuni esempi di codice. –

+0

Hai qualche codice? Ad esempio uno stub che deve essere compilato con una particolare funzione di andamento? –

risposta

5

Ho trovato diversi esempi utili online e ho utilizzato gli algoritmi per scrivere le mie funzioni di Delphi Easing. Eccoli:

... 

type 
    TChromeTabsEaseType = (
    ttlinearTween, 
    tteaseInQuad, 
    tteaseOutQuad, 
    tteaseInOutQuad, 
    tteaseInCubic, 
    tteaseOutCubic, 
    tteaseInOutCubic, 
    tteaseInQuart, 
    tteaseOutQuart, 
    tteaseInOutQuart, 
    tteaseInQuint, 
    tteaseOutQuint, 
    tteaseInOutQuint, 
    tteaseInSine, 
    tteaseOutSine, 
    tteaseInOutSine, 
    tteaseInExpo, 
    tteaseOutExpo, 
    tteaseInOutExpo, 
    tteaseInCirc, 
    tteaseOutCirc, 
    tteaseInOutCirc 
); 

    function CalculateEase(CurrentTime, StartValue, ChangeInValue, Duration: Real; EaseType: TChromeTabsEaseType): Real; overload; 
    function CalculateEase(StartPos, EndPos, PositionPct: Real; EaseType: TChromeTabsEaseType): Real; overload; 

implementation 

    function CalculateEase(CurrentTime, StartValue, ChangeInValue, Duration: Real; EaseType: TChromeTabsEaseType): Real; 
    begin 
     case EaseType of 
     ttLinearTween: 
      begin 
      Result := ChangeInValue * CurrentTime/Duration + StartValue; 
      end; 

     ttEaseInQuad: 
      begin 
      CurrentTime := CurrentTime/Duration; 

       Result := ChangeInValue * CurrentTime * CurrentTime + StartValue; 
      end; 

     ttEaseOutQuad: 
      begin 
      CurrentTime := CurrentTime/Duration; 

       Result := -ChangeInValue * CurrentTime * (CurrentTime-2) + StartValue; 
      end; 

     ttEaseInOutQuad: 
      begin 
      CurrentTime := CurrentTime/(Duration/2); 

      if CurrentTime < 1 then 
       Result := ChangeInValue/2 * CurrentTime * CurrentTime + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 1; 
       Result := -ChangeInValue/2 * (CurrentTime * (CurrentTime - 2) - 1) + StartValue; 
      end; 
      end; 

     ttEaseInCubic: 
      begin 
      CurrentTime := CurrentTime/Duration; 

      Result := ChangeInValue * CurrentTime * CurrentTime * CurrentTime + StartValue; 
      end; 

     ttEaseOutCubic: 
      begin 
      CurrentTime := (CurrentTime/Duration) - 1; 

      Result := ChangeInValue * (CurrentTime * CurrentTime * CurrentTime + 1) + StartValue; 
      end; 

     ttEaseInOutCubic: 
      begin 
      CurrentTime := CurrentTime/(Duration/2); 

      if CurrentTime < 1 then 
       Result := ChangeInValue/2 * CurrentTime * CurrentTime * CurrentTime + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 2; 

       Result := ChangeInValue/2 * (CurrentTime * CurrentTime * CurrentTime + 2) + StartValue; 
      end; 
      end; 

     ttEaseInQuart: 
      begin 
      CurrentTime := CurrentTime/Duration; 

      Result := ChangeInValue * CurrentTime * CurrentTime * CurrentTime * CurrentTime + StartValue; 
      end; 

     ttEaseOutQuart: 
      begin 
      CurrentTime := (CurrentTime/Duration) - 1; 

      Result := -ChangeInValue * (CurrentTime * CurrentTime * CurrentTime * CurrentTime - 1) + StartValue; 
      end; 

     ttEaseInOutQuart: 
      begin 
       CurrentTime := CurrentTime/(Duration/2); 

      if CurrentTime < 1 then 
       Result := ChangeInValue/2 * CurrentTime * CurrentTime * CurrentTime * CurrentTime + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 2; 

       Result := -ChangeInValue/2 * (CurrentTime * CurrentTime * CurrentTime * CurrentTime - 2) + StartValue; 
      end; 
      end; 

     ttEaseInQuint: 
      begin 
      CurrentTime := CurrentTime/Duration; 

      Result := ChangeInValue * CurrentTime * CurrentTime * CurrentTime * CurrentTime * CurrentTime + StartValue; 
      end; 

     ttEaseOutQuint: 
      begin 
      CurrentTime := (CurrentTime/Duration) - 1; 

       Result := ChangeInValue * (CurrentTime * CurrentTime * CurrentTime * CurrentTime * CurrentTime + 1) + StartValue; 
      end; 

     ttEaseInOutQuint: 
      begin 
      CurrentTime := CurrentTime/(Duration/2); 
      if CurrentTime < 1 then 
       Result := ChangeInValue/2 * CurrentTime * CurrentTime * CurrentTime * CurrentTime * CurrentTime + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 2; 

       Result := ChangeInValue/2 * (CurrentTime * CurrentTime * CurrentTime * CurrentTime * CurrentTime + 2) + StartValue; 
      end; 
      end; 

     ttEaseInSine: 
      begin 
       Result := -ChangeInValue * Cos(CurrentTime/Duration * (PI/2)) + ChangeInValue + StartValue; 
      end; 

     ttEaseOutSine: 
      begin 
       Result := ChangeInValue * Sin(CurrentTime/Duration * (PI/2)) + StartValue; 
      end; 

     ttEaseInOutSine: 
      begin 
      Result := -ChangeInValue/2 * (Cos(PI * CurrentTime/Duration) - 1) + StartValue; 
      end; 

     ttEaseInExpo: 
      begin 
      Result := ChangeInValue * Power(2, 10 * (CurrentTime/Duration - 1)) + StartValue; 
      end; 

     ttEaseOutExpo: 
      begin 
      Result := ChangeInValue * (-Power(2, -10 * CurrentTime/Duration) + 1) + StartValue; 
      end; 

     ttEaseInOutExpo: 
      begin 
      CurrentTime := CurrentTime/(Duration/2); 

      if CurrentTime < 1 then 
       Result := ChangeInValue/2 * Power(2, 10 * (CurrentTime - 1)) + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 1; 

       Result := ChangeInValue/2 * (-Power(2, -10 * CurrentTime) + 2) + StartValue; 
      end; 
      end; 

     ttEaseInCirc: 
      begin 
      CurrentTime := CurrentTime/Duration; 

       Result := -ChangeInValue * (Sqrt(1 - CurrentTime * CurrentTime) - 1) + StartValue; 
      end; 

     ttEaseOutCirc: 
      begin 
      CurrentTime := (CurrentTime/Duration) - 1; 

      Result := ChangeInValue * Sqrt(1 - CurrentTime * CurrentTime) + StartValue; 
      end; 

     ttEaseInOutCirc: 
      begin 
      CurrentTime := CurrentTime/(Duration/2); 

      if CurrentTime < 1 then 
       Result := -ChangeInValue/2 * (Sqrt(1 - CurrentTime * CurrentTime) - 1) + StartValue 
      else 
      begin 
       CurrentTime := CurrentTime - 2; 

       Result := ChangeInValue/2 * (Sqrt(1 - CurrentTime * CurrentTime) + 1) + StartValue; 
      end; 
      end; 
     end; 
    end; 

    function CalculateEase(StartPos, EndPos, PositionPct: Real; EaseType: TChromeTabsEaseType): Real; 
    var 
     t, b, c, d: Real; 
    begin 
     c := EndPos - StartPos; 
     d := 100; 
     t := PositionPct; 
     b := StartPos; 

     Result := CalculateEase(t, b, c, d, EaseType); 
    end; 

    ... 
+0

Nice;) dovresti accettare il tuo per rispondere in quel caso :) –

+0

@Diego - Lo farò, ma ho bisogno di aspettare 2 giorni prima che SO mi lasci: o) – norgepaul

+0

E la licenza di quel codice? Va bene usarlo in applicazioni commerciali? – Flash

Problemi correlati