Skip to content

Commit df62fac

Browse files
committed
feat: improve heart beat animation
1 parent 98eef60 commit df62fac

File tree

3 files changed

+11
-36
lines changed

3 files changed

+11
-36
lines changed

heart/config.py

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
BASE_HEART_COLOR = "tomato"
66
BASE_HEART_TEXT_COLOR = "bisque"
77
BASE_TEXT_STYLE = "font-size:25px; font-family:Arial"
8+
BASE_HEART_RATE = 1.2
89

910
PATH_D = "M92.71,7.27L92.71,7.27c-9.71-9.69-25.46-9.69-35.18,0L50,14.79l-7.54-7.52C32.75-2.42,17-2.42,7.29,7.27v0 c-9.71,9.69-9.71,25.41,0,35.1L50,85l42.71-42.63C102.43,32.68,102.43,16.96,92.71,7.27z"

heart/heart.py

+8-24
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from .config import (
77
BASE_HEART_COLOR,
8+
BASE_HEART_RATE,
89
BASE_HEART_TEXT_COLOR,
910
BASE_PATH_TRANSLATE,
1011
BASE_TEXT_STYLE,
@@ -13,7 +14,7 @@
1314
THREE_LETTERS_TEXT_TRANSLATE,
1415
TWO_LETTERS_TEXT_TRANSLATE,
1516
)
16-
from .utils import intersperse, make_key_times, make_key_values
17+
from .utils import make_key_times, make_key_values
1718

1819

1920
class Heart:
@@ -53,12 +54,10 @@ def _make_path(self):
5354
)
5455

5556
def _make_base_animate_transform(self):
56-
values = self._make_heart_scale_values()
57-
values_str = ";".join(values) + ";"
5857
return AnimateTransform(
5958
type="scale",
60-
dur=self.dur,
61-
values=values_str,
59+
dur= str(BASE_HEART_RATE)+'s',
60+
values='1; 1.5; 1.25; 1.5; 1.5; 1;',
6261
repeatCount="indefinite",
6362
additive="sum",
6463
transform="scale",
@@ -67,8 +66,8 @@ def _make_base_animate_transform(self):
6766
def _make_animate(self, index):
6867
num_count = len(self.values)
6968
a = Animate(
70-
"opacity",
71-
dur=self.dur,
69+
"visibility",
70+
dur=str(num_count*BASE_HEART_RATE)+'s',
7271
values=make_key_values(num_count, index),
7372
keyTimes=make_key_times(num_count),
7473
repeatCount="indefinite",
@@ -91,24 +90,9 @@ def __compute_statistics(self):
9190
if not self.values:
9291
raise Exception("No heart rate values set")
9392
dur_break_points = (5, 10, 15, 20)
93+
num_count = len(self.values)
9494
i = bisect(dur_break_points, len(self.values))
95-
self.dur = str(12 * i) + "s"
96-
97-
def _make_heart_scale_values(self):
98-
"""
99-
break_points -> scale number
100-
"""
101-
break_points = ("0.625", "0.75", "0.875", "1.125", "1.25", "1.375", "1.5")
102-
min_value, max_value = min(self.values), max(self.values)
103-
interval = (max_value - min_value) / 5
104-
heart_rate_points = [min_value + interval * i for i in range(5)]
105-
heart_rate_points.append(max_value)
106-
heart_scale_list = [
107-
break_points[bisect(heart_rate_points, i)] for i in self.values
108-
]
109-
# Make the effect of a beating heart
110-
heart_scale_list = intersperse(heart_scale_list, "1")
111-
return heart_scale_list
95+
self.dur = str(num_count)+'s',
11296

11397
def make_heart_svg(self):
11498
self.__compute_statistics()

heart/utils.py

+2-12
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,6 @@ def make_key_times(num_count):
1414

1515

1616
def make_key_values(num_count, index):
17-
l = ["0"] * (num_count + 1)
18-
l[index] = "1"
17+
l = ["hidden"] * (num_count + 1)
18+
l[index] = "visible"
1919
return ";".join(l)
20-
21-
22-
def intersperse(lst, item):
23-
"""
24-
from lst = [0.75, 1.2, 1.3, 0.8, 1.4, 1.2]
25-
to lst = [0.75, 1, 1.2, 1, 1.3, 1, 0.8, 1, 1.4, 1, 1.2, 1]
26-
"""
27-
result = [item] * (len(lst) * 2 - 1)
28-
result[0::2] = lst
29-
return result

0 commit comments

Comments
 (0)