Reanimated: 60fps Animations
Animasi di UI thread — bebas dari JS thread bottleneck
Tujuan Pembelajaran
- Memahami perbedaan Animated API vs Reanimated
- Mampu menggunakan useSharedValue dan useAnimatedStyle
- Mengerti worklet dan UI thread execution
Analogi
Animated API = Kirim Surat:
JS Thread (kamu) → Bridge → Native Thread (tukang pos) → animasi
Delay: bridge communication bottleneck
Reanimated = Telegram Langsung:
UI Thread (tukang pos) → animasi langsung
tanpa JS Thread perantara. Instant.
Reanimated seperti telegram — animasi berjalan langsung di UI thread tanpa harus komunikasi dengan JS thread. Hasil: 60fps mulus.
Penjelasan Konsep
Reanimated adalah library animasi dari Software Mansion — pengganti Animated API bawaan. Keunggulan utama: animasi berjalan di UI thread, bukan JS thread.
Kenapa UI thread penting: (1) JS thread sibuk (fetch API, process data, render component) → animasi janky. (2) UI thread dedicated untuk rendering — selalu idle kecuali ada animasi. (3) Reanimated worklet = JavaScript yang jalan di UI thread. (4) Tidak butuh bridge communication.
Shared Values: useSharedValue(0) — nilai yang bisa dibaca dan ditulis dari JS thread DAN UI thread. Mirip Animated.Value tapi lebih powerful.
Animated Styles: useAnimatedStyle(() => ({ opacity: sharedValue.value, transform: [{ translateX: sharedValue.value * 200 }] })). Return style object yang auto-update saat sharedValue berubah.
Animations: withTiming(sharedValue, { toValue: 1, duration: 300 }), withSpring(sharedValue, { toValue: 1, damping: 15 }), withDecay(), withSequence(), withRepeat().
Gestures: Reanimated 2 + React Native Gesture Handler = combo mematikan. Gesture updates langsung ke UI thread → animasi 60fps.
Worklets: function dengan directive 'worklet' di awal. Bisa jalan di UI thread. function onScroll() { 'worklet'; ... }. Worklet tidak bisa akses closure dari JS scope.
Inti yang Perlu Dipahami
Bagian ini berfokus pada memahami perbedaan Animated API vs Reanimated., mampu menggunakan useSharedValue dan useAnimatedStyle., dan mengerti worklet dan UI thread execution. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.
Saat membaca Reanimated, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.
Cara Membayangkannya
Reanimated seperti telegram — animasi berjalan langsung di UI thread tanpa harus komunikasi dengan JS thread. Hasil: 60fps mulus. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.
Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.
Saat Melihat Contoh Kode
Contoh kode pada chapter ini memakai bahasa tsx. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. useSharedValue untuk nilai animasi. useAnimatedStyle untuk style yang auto-update. withSpring untuk animasi physics-based. Semua jalan di UI thread.
Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.
Konteks dalam Perjalanan Belajar
Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.
Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.
Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.
Contoh Kode
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from "react-native-reanimated";
export default function BouncyBox() {
const scale = useSharedValue(1);
const style = useAnimatedStyle(() => ({ transform: [{ scale: scale.value }] }));
const onPress = () => { scale.value = withSpring(1.5, {}, () => { scale.value = withSpring(1); }); };
return <Animated.View style={[{ width: 100, height: 100, backgroundColor: "blue" }, style]} />;
}Penjelasan Kode
Prompt AI
Buat animasi gesture-based: user drag card ke kanan → card rotate dan fade out → background berubah hijau (like) atau merah (dislike). Gunakan Reanimated + Gesture Handler. Tulis kode lengkapnya.
Pertanyaan Reflektif
Cari 3 animasi keren di aplikasi mobile favoritmu. Bisakah kamu identifikasi apakah mereka menggunakan native driver atau JS thread?