Кроме реакта и его дизайна ;)
в нас є Animated, яикй не ідеальний, але можливо має якісь прикольні ідеї
Загалом в тебе є якась в’юха — то саме шо твій shape. У неї є набір пропертів, які можна анімувати — всі шо приконекчені до нативних пропертів, типу стилів, а також деяких буліанів, тексту і тд
У тебе є Animated.Value, який є базовим класом для змінної, яку можна анімувати, її ти маєш прокинути як значення конкретної властивості, але ти можеш це скіпнути, думаючи що сходу є якийсь набір значень, які можуть бути анімованими, думаю так чи інакше ти зможеш виділити якийсь пул їх, не обов’язково стилі
і є Animated.timing — це функція, яка приймає Animated.Value, яку ти хоч анімувати, а також конфіг того, як саме ти то хоч зробити
під капотом (я зараз буду більше про андроїд говорити, хоч реалізації дуже схожі) ж клас, який відповідає за конкретний Animated.Value, є абстрактний клас AnimationDriver, від якого наслідуються інші, наприклад FrameBasedAnimationDriver, він полем має ту AnimatedValue, яку зараз анімує, а є, для прикладу, InterpolationAnimatedDriver, який приймає як коніг для інтерполяції, так значення яке інтерполюють
тобто драйвер завжди анімує лиш один Animated.Value, в тебе це може бути конкретне поле Shape
проте як показує практика написання анімацій, далеко на такому і так не заїдеш, тому шо ти захочеш (або твій користувач) писати кастумну логіку на кожен фрейм (саме через це, існують такі проекти як Reanimated), де в більшій мірі в тебе є таке поняття як Clock, ти його запускаєш, і на основі нього вже мутиш всякі timing/spring. Важливою складовою Clock є те, що ти можеш оголосити один для декількох анімацій (драйверів), відповідно вони точно будуть синхронізовані, тому що всі апдейти будуть в одному фреймі