Membangun aplikasi yang bisa dipakai semua orang: screen reader TalkBack & VoiceOver, touch targets, dynamic type, kontras warna, dan langkah audit aksesibilitas Fitku

Setelah episode 24 memperluas Fitku ke widget dan smartwatch, kini dimensi kualitas terakhir yang sering diabaikan: accessibility. Episode 25 ini membahas accessibility mobile — screen reader (TalkBack/VoiceOver), touch targets, dynamic type, dan kontras warna — lalu menutupnya dengan audit aksesibilitas Fitku.
Mengapa ini penting? Sekitar 1 dari 7 orang di dunia hidup dengan disabilitas, dan pengguna ponsel sangat beragam: ada yang memakai screen reader, memperbesar teks 3x, atau menavigasi hanya dengan tombol. Regulasi (seperti EU Accessibility Act) makin menuntut, dan kedua store makin ketat dalam review. Lebih dari itu, aksesibilitas adalah kualitas produk: tombol yang cukup besar dan teks yang kontras baik juga membantu semua orang. Ini pelengkap dimensi etika yang kita mulai di episode 20.
Web Content Accessibility Guidelines (WCAG) merangkumnya dalam POUR:
Di mobile, keempat prinsip ini diterjemahkan ke praktik konkret di bawah.
TalkBack (Android) dan VoiceOver (iOS) membacakan isi layar dengan gesekan & sentuhan. Syaratnya: setiap elemen penting punya nama yang dibacakan.
Icon(
imageVector = Icons.Default.PlayArrow,
contentDescription = "Mulai latihan",
modifier = Modifier.clickable { startWorkout() }
)
// grup yang dibaca sebagai satu kesatuan
Text(
"Langkah hari ini: 8.432 dari target 10.000",
modifier = Modifier.semantics { mergeDescendants() }
)Di SwiftUI dan React Native caranya serupa:
Button(action: startWorkout) {
Image(systemName: "play.fill")
}
.accessibilityLabel("Mulai latihan")
.accessibilityHint("Memulai workout lari selama 30 menit")<TouchableOpacity
accessibilityLabel="Mulai latihan"
accessibilityRole="button"
onPress={startWorkout}
>
<Icon name="play" />
</TouchableOpacity>Note
Aturan emas: jangan pernah menaruh teks yang terlihat di layar sebagai satu gambar tanpa alternatif teks; dan jangan menyembunyikan elemen penting dari screen reader hanya karena terlihat "dekoratif". Dekoratif boleh diabaikan, fungsional tidak pernah.
Target sentuh yang terlalu kecil membuat frustrasi semua orang, dan praktis mustahil bagi sebagian pengguna. Standar minimum 48x48 dp (Material) / 44 pt (Apple):
Icon(
imageVector = Icons.Default.Close,
contentDescription = "Tutup",
modifier = Modifier
.size(24.dp)
.clickable { onClose() }
.padding(12.dp) // area efektif menjadi 48dp
)Pengguna dengan gangguan penglihatan memperbesar teks sistem hingga 200% atau lebih. Aplikasi harus mengikuti:
Text("Sisa latihan: 12 menit")
.font(.body) // otomatis mengikuti Dynamic Type
.lineLimit(nil) // jangan potong saat membesarDi Compose, pastikan Text memakai style dari Material Theme (yang berbasis sp), bukan fontSize hardcoded dalam dp.
Teks abu-abu #757575 di atas putih #FFFFFF
→ rasio kontras 4.6:1 → lolos AA untuk teks normal
→ jika #999999 (3.0:1) → gagal, hanya boleh untuk teks besar[ ] Navigasi lengkap dengan TalkBack & VoiceOver dari login sampai logout
[ ] Semua ikon punya contentDescription/accessibilityLabel
[ ] Semua target sentuh >= 48dp / 44pt
[ ] Teks mengikuti dynamic type hingga ukuran maksimum
[ ] Kontras teks >= 4.5:1, tidak ada info hanya via warna
[ ] Tombol & form memiliki label & fokus yang jelasGunakan alat bantu: TalkBack (AOSP), VoiceOver (Apple), Accessibility Scanner (Android) untuk menemukan target sentuh & kontras bermasalah, serta axe untuk React Native. Buat audit aksesibilitas sebagian dari definisi done, bukan aktivitas terpisah di akhir.
Tip
Uji sesering mungkin dengan cara manual: aktifkan TalkBack/VoiceOver dan coba pakai aplikasi tanpa melihat layar. Pengalaman ini adalah guru terbaik — kalian akan langsung menemukan elemen tanpa label, urutan fokus yang kacau, dan tombol yang mustahil ditekan. Cukup 10 menit sekali sprint untuk menjaga kualitas.
userScalable=no atau hardcode ukuran font = memutus akses.Pada episode 25 ini, kalian telah menjadikan Fitku inklusif:
Dengan aplikasi yang berfungsi, tahan offline, hadir di widget/watch, dan inklusif, kita kini mundur selangkah melihat gambaran besar: di episode 26 kita bahas Ekosistem & Tren Modern 2026 — lanskap cross-platform, posisi AI, dan cara memilih stack yang tepat. Sampai jumpa!