2012-12-19 11 views
6

Próbuję zaimplementować płynny ruch kart w TChromeTabs. Widzę łagodne formuły here, ale nie jestem matematykiem i nie mam pojęcia, jak przetłumaczyć to na kod. Dotychczasowe próby doprowadziły mnie do nikąd.Implementowanie funkcji EaseIn, EaseOut w Delphi

Czy są dostępne implementacje Delphi funkcji Easing?

+2

Możesz przetestować rodzaje efektów łagodzenia tutaj http://gizma.com/easing/Aditionaly ma kilka wyjaśnień i niektóre próbki kodu. –

+0

Czy masz jakiś kod? Na przykład odcinek, który należy wypełnić specjalną funkcją rozluźniającą? –

Odpowiedz

5

Znalazłem kilka użytecznych przykładów online i wykorzystałem algorytmy do napisania własnych funkcji Delphi Easing. Oto one:

... 

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;) powinieneś zaakceptować swój answear w takim przypadku :) –

+0

@Diego - Będę, ale muszę poczekać 2 dni, zanim SO pozwoli mi: o) – norgepaul

+0

Co z licencją tego kodu? Czy można go używać w aplikacjach komercyjnych? – Flash

Powiązane problemy