Pendahuluan
Membuat Aplikasi Dice Roller Interaktif
- Membuka Android Studi dan memilih opsi "Empty Activity".
- Setelah memilih template Empty Activity kita akan menuliskan nama proyek kita yaitu "Dice Roller" dan memilih level API minimum untuk proyek kita, disini kita akan memilih API 24 (Nougat).
- Setelah kode template berhasil dimuat kita akan mengubah struktur kode default proyek.
- Kemudian kita akan membuat infrastruktur tata letak.
Lalu kita akan membuat rantai metode fillMaxSize() ke objek Modifier sehingga tata letak mengisi seluruh layar. Kemudian buat juga rantai metode wrapContentSize() ke objek Modifier yang meneruskan argumen Alignment.Center untuk memusatkan komponen.
- Membuat tata letak vertikal
Pada Compose, tata letak vertikal dibuat menggunakan fungsi Column(). Fungsi tersebut ada fungsi tata letak composable yang menempatkan turunannya dalam urutan secara vertikal.
Untuk membuat tata letak vertikal kita akan melakukan langkah seperti ini:
📙 Menambahkan fungsi Column() dalam fungsi DiceWithButtonAndImage().
📙 Meneruskan argumen modifier dari metode DiceWithButtonAndImage() ke argumen pengubah ColumnArgumen modifier disini memastikan bahwa Composable dalam fungsi Column() mematuhi batasan yang dipanggil pada instance modifier.
📙 Meneruskan argumen horizontalAlignment ke fungsi Column(), kemudian menetapkan nilai Alignment.CenterHorizontally.
- Menambahkan komponen Button dan String "Roll".
- Klik (+) -> Import Drawables untuk membuka file browser.
Kemudian untu menambahkan gambar pada project ini, kita akan menggunakan fungsi Image() dan menempatkannya sebelum fungsi Button(). Lalu kita akan teruskan argumen painter ke fungsi Image(), lalu tetapkan nilai painterResource yang menerima argumen ID resource drawable. Selain itu kita akan menambahkan fungsi Spacer() untuk memberikan jarak antara gambar dengan tombol.
- Membuat logika pelemparan dadu
Composable bersifat stateless secara default, yang berarti bahwa composable tersebut tidak memiliki nilai dan dapat disusun ulang oleh sistem kapan saja sehingga mengakibatkan nilai tersebut direset. Namun, Compose menyediakan cara yang praktis untuk menghindari hal ini. Fungsi composable dapat menyimpan objek dalam memori menggunakan composable remember.
Fungsi mutableStateOf() akan menampilkan objek yang dapat diamati. Pada dasarnya ini berarti bahwa saat nilai variabel result berubah, rekomposisi akan dipicu, nilai hasilnya akan tercermin, dan UI akan di muat ulang.Sekarang, saat tombol diketuk, variabel result akan diupdate dengan nilai angka acak. Variabel result dapat digunakan untuk menentukan gambar yang akan ditampilkan.
package com.example.diceroller | |
import android.os.Bundle | |
import androidx.activity.ComponentActivity | |
import androidx.activity.compose.setContent | |
import androidx.compose.foundation.Image | |
import androidx.compose.foundation.layout.Column | |
import androidx.compose.foundation.layout.Spacer | |
import androidx.compose.foundation.layout.fillMaxSize | |
import androidx.compose.foundation.layout.height | |
import androidx.compose.foundation.layout.wrapContentSize | |
import androidx.compose.material3.Button | |
import androidx.compose.material3.MaterialTheme | |
import androidx.compose.material3.Surface | |
import androidx.compose.material3.Text | |
import androidx.compose.runtime.Composable | |
import androidx.compose.runtime.getValue | |
import androidx.compose.runtime.mutableStateOf | |
import androidx.compose.runtime.remember | |
import androidx.compose.runtime.setValue | |
import androidx.compose.ui.Alignment | |
import androidx.compose.ui.Modifier | |
import androidx.compose.ui.res.painterResource | |
import androidx.compose.ui.res.stringResource | |
import androidx.compose.ui.tooling.preview.Preview | |
import androidx.compose.ui.unit.dp | |
import com.example.diceroller.ui.theme.DiceRollerTheme | |
class MainActivity : ComponentActivity() { | |
override fun onCreate(savedInstanceState: Bundle?) { | |
super.onCreate(savedInstanceState) | |
setContent { | |
DiceRollerTheme { | |
// A surface container using the 'background' color from the theme | |
Surface( | |
modifier = Modifier.fillMaxSize(), | |
color = MaterialTheme.colorScheme.background | |
) { | |
DiceRollerApp() | |
} | |
} | |
} | |
} | |
} | |
@Preview | |
@Composable | |
fun DiceRollerApp() { | |
DiceWithButtonAndImage() | |
} | |
@Composable | |
fun DiceWithButtonAndImage(modifier: Modifier = Modifier | |
.fillMaxSize() | |
.wrapContentSize(Alignment.Center)) { | |
var result by remember { | |
mutableStateOf(1) | |
} | |
val imageResource = when (result) { | |
1 -> R.drawable.dice_1 | |
2 -> R.drawable.dice_2 | |
3 -> R.drawable.dice_3 | |
4 -> R.drawable.dice_4 | |
5 -> R.drawable.dice_5 | |
else -> R.drawable.dice_6 | |
} | |
Column(modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally) { | |
Image(painter = painterResource(imageResource), contentDescription = result.toString() ) | |
Spacer(modifier = Modifier.height(16.dp)) | |
Button(onClick = { result = (1..6).random() }) { | |
Text(stringResource(R.string.roll)) | |
} | |
} | |
} |
<resources> | |
<string name="app_name">Dice Roller</string> | |
<string name="roll">Roll</string> | |
</resources> |
Comments
Post a Comment