Coverage for lib/lottie/objects/easing.py: 71%

41 statements  

« prev     ^ index     » next       coverage.py v7.2.2, created at 2023-03-20 16:17 +0100

1import math 

2from .base import LottieObject, LottieProp, PseudoList, PseudoBool 

3 

4 

5## @ingroup Lottie 

6class KeyframeBezierHandle(LottieObject): 

7 """! 

8 Bezier handle for keyframe interpolation 

9 """ 

10 _props = [ 

11 LottieProp("x", "x", list=PseudoList), 

12 LottieProp("y", "y", list=PseudoList), 

13 ] 

14 

15 def __init__(self, x=0, y=0): 

16 ## x position of the handle. 

17 ## This represents the change in time of the keyframe 

18 self.x = x 

19 ## y position of the handle. 

20 ## This represents the change in value of the keyframe 

21 self.y = y 

22 

23 

24class Linear: 

25 """! 

26 Linear easing, the value will change from start to end in a straight line 

27 """ 

28 def __call__(self, keyframe): 

29 keyframe.out_value = KeyframeBezierHandle( 

30 0, 

31 0 

32 ) 

33 keyframe.in_value = KeyframeBezierHandle( 

34 1, 

35 1 

36 ) 

37 

38 

39class EaseIn: 

40 """! 

41 The value lingers near the start before accelerating towards the end 

42 """ 

43 def __init__(self, delay=1/3): 

44 self.delay = delay 

45 

46 def __call__(self, keyframe): 

47 keyframe.out_value = KeyframeBezierHandle( 

48 self.delay, 

49 0 

50 ) 

51 keyframe.in_value = KeyframeBezierHandle( 

52 1, 

53 1 

54 ) 

55 

56 

57class EaseOut: 

58 """! 

59 The value starts fast before decelerating towards the end 

60 """ 

61 def __init__(self, delay=1/3): 

62 self.delay = delay 

63 

64 def __call__(self, keyframe): 

65 keyframe.out_value = KeyframeBezierHandle( 

66 0, 

67 0 

68 ) 

69 keyframe.in_value = KeyframeBezierHandle( 

70 1-self.delay, 

71 1 

72 ) 

73 

74 

75class Jump: 

76 """! 

77 Jumps to the end value at the end of the keyframe 

78 """ 

79 def __call__(self, keyframe): 

80 keyframe.jump = True 

81 

82 

83class Sigmoid: 

84 """! 

85 Combines the effects of EaseIn and EaseOut 

86 """ 

87 def __init__(self, delay=1/3): 

88 self.delay = delay 

89 

90 def __call__(self, keyframe): 

91 keyframe.out_value = KeyframeBezierHandle( 

92 self.delay, 

93 0 

94 ) 

95 keyframe.in_value = KeyframeBezierHandle( 

96 1 - self.delay, 

97 1 

98 ) 

99 

100 

101class Split: 

102 """ 

103 Uses different easing methods for in/out 

104 """ 

105 

106 def __init__(self, out_ease, in_ease): 

107 self.out_ease = out_ease 

108 self.in_ease = in_ease 

109 

110 def __call__(self, keyframe): 

111 self.out_ease(keyframe) 

112 t = keyframe.out_value 

113 self.in_ease(keyframe) 

114 keyframe.out_value = t