Tugas PPB Pertemuan 11

Nathanael Valen Susilo 
5025231099

Desain Aplikasi Market Siswa

MarketSiswa adalah aplikasi marketplace sederhana berbasis Android yang dibangun menggunakan Jetpack Compose dan Material Design 3 (Material You). Aplikasi ini dirancang sebagai platform jual-beli antar mahasiswa, di mana pengguna dapat melihat daftar produk, menambahkan produk baru dengan memilih kategori, serta mengelola profil pribadi.

Fitur utama:

  • Daftar produk dengan ikon kategori dan badge warna.
  • Form tambah produk dengan dropdown kategori (Makanan dan Minuman, Fashion, Elektronik, Buku dan Alat Tulis, Aksesoris, Jasa, Lainnya).
  • Opsi kategori kustom melalui pilihan "Lainnya".
  • Halaman profil dengan statistik dan menu pengaturan.
  • Animasi transisi antar halaman.
  • Notifikasi snackbar setelah produk ditambahkan.

Struktur Proyek

MarketSiswa/
  app/
    src/main/
      AndroidManifest.xml
      java/com/example/marketsiswa/
        MainActivity.kt            -- Activity utama yang berisi semua Composable screen
        ui/theme/
          Color.kt                 -- Palet warna biru MarketSiswa
          Theme.kt                 -- Konfigurasi tema Material 3
          Type.kt                  -- Tipografi
  build.gradle.kts                 -- Konfigurasi build root
  gradle/libs.versions.toml        -- Version catalog untuk dependensi

Prinsip Material Design

Material Design adalah sistem desain yang dikembangkan oleh Google untuk menciptakan antarmuka pengguna yang konsisten, responsif, menarik secara visual, dan mudah digunakan. Versi terbaru dikenal sebagai Material You (Material Design 3) yang lebih personal dan dinamis.

Berikut adalah tiga prinsip utama Material Design beserta penjelasan konsep dan contoh implementasinya di dalam kode MarketSiswa.

1. Material is the Metaphor

Prinsip pertama menyatakan bahwa elemen UI dianalogikan seperti benda nyata. Sebuah kartu memiliki bayangan yang menunjukkan bahwa ia terangkat dari permukaan. Tombol aksi mengambang (FAB) terlihat berada di layer paling atas. Sistem lapisan (layering) ini membantu pengguna memahami hierarki dan hubungan antar elemen secara intuitif, layaknya lembaran kertas yang bertumpuk di atas meja dengan ketinggian yang berbeda-beda.

Contoh implementasi pada kartu produk di Home Screen:

```kotlin
Card(
    modifier = Modifier.fillMaxWidth(),
    shape = RoundedCornerShape(16.dp),
    colors = CardDefaults.cardColors(
        containerColor = MaterialTheme.colorScheme.surface
    ),
    elevation = CardDefaults.cardElevation(defaultElevation = 2.dp)
) {
    Row(
        Modifier.fillMaxWidth().padding(14.dp),
        horizontalArrangement = Arrangement.spacedBy(12.dp)
    ) {
        // Kolom kiri: ikon kategori dalam box berwarna
        Box(
            modifier = Modifier.size(48.dp)
                .clip(RoundedCornerShape(12.dp))
                .background(MaterialTheme.colorScheme.primaryContainer),
            contentAlignment = Alignment.Center
        ) {
            Icon(
                getCategoryIcon(product.category),
                contentDescription = null,
                tint = MaterialTheme.colorScheme.onPrimaryContainer
            )
        }
        // Kolom kanan: nama, harga, deskripsi, badge kategori
        Column(Modifier.weight(1f)) {
            Text(product.name, fontWeight = FontWeight.Bold)
            Text("Rp ${product.price}",
                color = MaterialTheme.colorScheme.primary)
            Text(product.description,
                color = MaterialTheme.colorScheme.onSurfaceVariant)
        }
    }
}
```
Pada kode di atas, Card menggunakan elevation sebesar 2dp yang menghasilkan bayangan halus di bawahnya. Hal ini memberikan kesan bahwa kartu tersebut terangkat dari permukaan background biru muda, persis seperti selembar kertas yang diletakkan di atas meja. Warna surface (putih) pada kartu kontras dengan background (biru muda), memperkuat persepsi kedalaman. Di dalam kartu, Box dengan warna primaryContainer berfungsi sebagai elemen yang tampak berada di layer tersendiri, memberi kesan material bertingkat.

2. Bold, Graphic, Intentional

Prinsip kedua menekankan penggunaan tipografi yang tegas, warna yang kontras, dan layout yang tidak berantakan. Setiap keputusan desain harus memiliki tujuan yang jelas. Elemen penting diberi penekanan visual melalui ukuran font, ketebalan (font weight), dan warna, sehingga pengguna bisa langsung memahami hierarki informasi tanpa perlu membaca seluruh konten secara detail.

Contoh implementasi pada greeting card di Home Screen:

```kotlin
Card(
    modifier = Modifier.fillMaxWidth(),
    shape = RoundedCornerShape(20.dp),
    colors = CardDefaults.cardColors(
        containerColor = MaterialTheme.colorScheme.primaryContainer
    )
) {
    Column(Modifier.padding(20.dp)) {
        Text(
            "Halo, Siswa!",
            fontSize = 24.sp,
            fontWeight = FontWeight.ExtraBold,
            color = MaterialTheme.colorScheme.onPrimaryContainer
        )
        Spacer(Modifier.height(4.dp))
        Text(
            "Temukan ${products.size} produk dari sesama mahasiswa",
            fontSize = 14.sp,
            color = MaterialTheme.colorScheme
                .onPrimaryContainer.copy(alpha = 0.7f)
        )
    }
}
```

Pada kode di atas, terdapat dua tingkat hierarki visual yang jelas. Judul "Halo, Siswa!" menggunakan ukuran 24sp dengan fontWeight ExtraBold dan warna onPrimaryContainer (biru tua), menjadikannya elemen pertama yang dilihat pengguna. Subtitle di bawahnya menggunakan ukuran 14sp dengan opacity 70 persen, menciptakan kontras yang tegas antara informasi utama dan pendukung. Card menggunakan warna primaryContainer (biru muda) yang membedakannya secara grafis dari kartu produk berwarna putih di bawahnya. Semua keputusan warna, ukuran, dan ketebalan bersifat intentional: memandu mata pengguna dari greeting ke daftar produk secara alami.

3. Motion Provides Meaning

Prinsip ketiga menyatakan bahwa animasi bukan sekadar hiasan estetika, melainkan alat komunikasi yang membantu pengguna memahami perubahan yang terjadi di antarmuka. Transisi antar halaman menunjukkan arah navigasi. Indikator loading memberi feedback bahwa sistem sedang memproses permintaan. Elemen yang muncul atau menghilang secara animatif memberi konteks tentang hubungan antar komponen.

Contoh implementasi pada transisi halaman dan visibility kategori kustom:

```kotlin
// Transisi antar halaman
AnimatedContent(
    targetState = currentScreen,
    transitionSpec = {
        slideInHorizontally { it } + fadeIn() togetherWith
                slideOutHorizontally { -it } + fadeOut()
    },
    label = "nav"
) { screen ->
    when (screen) {
        "home" -> HomeScreen(productList)
        "add" -> AddProductScreen { /* callback */ }
        "profile" -> ProfileScreen()
    }
}

// Field kategori kustom muncul dengan animasi
AnimatedVisibility(visible = selectedCategory == "Lainnya") {
    OutlinedTextField(
        value = customCategory,
        onValueChange = { customCategory = it },
        label = { Text("Tulis kategori sendiri") },
        modifier = Modifier.fillMaxWidth(),
        shape = RoundedCornerShape(12.dp),
        singleLine = true
    )
}
```

Pada kode di atas, AnimatedContent mengelola transisi antar tiga halaman. Ketika pengguna berpindah halaman, halaman baru masuk dari sisi kanan layar bersamaan dengan efek fade in, sementara halaman sebelumnya keluar ke sisi kiri dengan efek fade out. Kombinasi slide dan fade ini memberikan kesan bahwa pengguna sedang bergerak maju dalam alur navigasi. Selain itu, AnimatedVisibility digunakan pada field kategori kustom: ketika pengguna memilih "Lainnya" dari dropdown, field input tambahan muncul secara perlahan dengan animasi expand. Ketika pengguna memilih kategori lain, field tersebut menghilang secara animatif. Tanpa animasi ini, kemunculan dan hilangnya field akan terasa tiba-tiba dan dapat membingungkan pengguna tentang apa yang berubah di layar.

Tampilan Aplikasi 

Halaman Utama Aplikasi


Halaman Formulir Penjualan untuk Menambahkan Produk



Halaman Profile Pengguna









Komentar

Postingan populer dari blog ini

Tugas PPB Pertemuan 1

Tugas PBB Pertemuan 5

ETS PPB (Pertemuan 8)