uianimator/
default_animator_f64_linear.rs1use std::time::Instant;
2
3use crate::Animator;
4
5pub struct DefaultAnimatorF64Linear {
6 value: f64,
7 time: Instant,
8 target: f64,
9 speed: f64,
11}
12impl DefaultAnimatorF64Linear {
13 pub fn new(value: f64, speed: f64) -> Self {
14 Self {
15 value,
16 time: Instant::now(),
17 target: value,
18 speed,
19 }
20 }
21 pub fn target(&self) -> f64 {
22 self.target
23 }
24}
25impl Animator for DefaultAnimatorF64Linear {
26 type Value = f64;
27 type Time = Instant;
28
29 fn get_value(&self, time: Self::Time) -> Self::Value {
30 if self.value < self.target {
31 self.target.min(
32 self.value + time.saturating_duration_since(self.time).as_secs_f64() * self.speed,
33 )
34 } else if self.value > self.target {
35 self.target.max(
36 self.value - time.saturating_duration_since(self.time).as_secs_f64() * self.speed,
37 )
38 } else {
39 self.target
40 }
41 }
42 fn set_target(&mut self, target: Self::Value, time: Self::Time) {
43 if self.target == target {
44 return;
45 }
46 self.value = self.get_value(time);
47 self.time = time;
48 self.target = target;
49 }
50}