๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2023 ์•ˆ๋“œ๋กœ์ด๋“œ/์•ˆ๋“œ๋กœ์ด๋“œ ์Šคํ„ฐ๋””

DiceRoller ๋ณต์Šต

by hyeonha 2023. 1. 10.

๋ชฉ์ฐจ

    ๋ ˆ์ด์•„์›ƒ ์ธํ”„๋ผ ๋งŒ๋“ค๊ธฐ

    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.*
    import androidx.compose.material.Button
    import androidx.compose.material.MaterialTheme
    import androidx.compose.material.Surface
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.ImageBitmap
    import androidx.compose.ui.input.key.Key.Companion.D
    import androidx.compose.ui.modifier.modifierLocalOf
    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 {
                    DiceRollerApp()
    
                }
            }
        }
    }
    @Preview
    @Composable
    fun DiceRollerApp() {
        DiceWithButtonAndImage(modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center))
            // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ด ์ตœ์†Œํ•œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋งŒํผ ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•œ๋‹ค
            //๊ตฌ์„ฑ์šง๋ฅผ ์„ธ๋กœ์™€ ๊ฐ€๋กœ๋กœ ๋ชจ๋‘ ์ค‘์•™์— ๋ฐฐ์น˜ 
    
    }
    
    @Preview(showBackground = true)
    @Composable
    fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
    
    }

    ์„ธ๋กœ ๋ ˆ์ด์•„์›ƒ ๋งŒ๋“ค๊ธฐ 

    Column () : ํ•˜์œ„ ์š”์†Œ๋ฅผ ์„ธ๋กœ ์ˆœ์„œ๋กœ ๋ฐฐ์น˜ํ•˜๋Š” ์ปดํฌ์ €๋ธ” ๋ ˆ์ด์•„์›ƒ 

     

    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.*
    import androidx.compose.material.Button
    import androidx.compose.material.MaterialTheme
    import androidx.compose.material.Surface
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.ImageBitmap
    import androidx.compose.ui.input.key.Key.Companion.D
    import androidx.compose.ui.modifier.modifierLocalOf
    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 {
                    DiceRollerApp()
    
                }
            }
        }
    }
    @Preview
    @Composable
    fun DiceRollerApp() {
        DiceWithButtonAndImage(modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center))
            // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ด ์ตœ์†Œํ•œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋งŒํผ ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•œ๋‹ค
            //๊ตฌ์„ฑ์šง๋ฅผ ์„ธ๋กœ์™€ ๊ฐ€๋กœ๋กœ ๋ชจ๋‘ ์ค‘์•™์— ๋ฐฐ์น˜
    
    
    }
    
    @Preview(showBackground = true)
    @Composable
    fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
        Column (
            modifier=modifier,
            //modifier ์ธ์ˆ˜๋Š” Column ํ•จ์ˆ˜์˜ ์ปดํฌ์ €๋ธ”์ด modifier ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•œ๋‹ค.  (?) 
            horizontalAlignment = Alignment.CenterHorizontally
            ) {
            //์—ด์ด ๋„ˆ๋น„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๊ธฐ ํ™”๋ฉด์˜ ์ค‘์•™์— ๋ฐฐ์น˜๋œ๋‹ค.
    
        } //Column body
    }//DiceWithButtonAndImage
    
    

    5. ๋ฒ„ํŠผ ์ถ”๊ฐ€ 

    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.*
    import androidx.compose.material.Button
    import androidx.compose.material.MaterialTheme
    import androidx.compose.material.Surface
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.ImageBitmap
    import androidx.compose.ui.input.key.Key.Companion.D
    import androidx.compose.ui.modifier.modifierLocalOf
    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 {
                    DiceRollerApp()
    
                }
            }
        }
    }
    @Preview
    @Composable
    fun DiceRollerApp() {
        DiceWithButtonAndImage(modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center))
            // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ด ์ตœ์†Œํ•œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋งŒํผ ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•œ๋‹ค
            //๊ตฌ์„ฑ์šง๋ฅผ ์„ธ๋กœ์™€ ๊ฐ€๋กœ๋กœ ๋ชจ๋‘ ์ค‘์•™์— ๋ฐฐ์น˜
    
    
    }
    
    //@Preview(showBackground = true)
    @Composable
    fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
        Column (
            modifier=modifier,
            //modifier ์ธ์ˆ˜๋Š” Column ํ•จ์ˆ˜์˜ ์ปดํฌ์ €๋ธ”์ด modifier ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•œ๋‹ค.  (?)
            horizontalAlignment = Alignment.CenterHorizontally
            ) {
            //์—ด์ด ๋„ˆ๋น„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๊ธฐ ํ™”๋ฉด์˜ ์ค‘์•™์— ๋ฐฐ์น˜๋œ๋‹ค.
            Button(onClick = {}) {
                Text(stringResource(R.string.roll))
            }
    
        } //Column body
    }//DiceWithButtonAndImage
    
    

    6. ์ด๋ฏธ์ง€ ์ถ”๊ฐ€

    ์ฃผ์‚ฌ์œ„ ์ด๋ฏธ์ง€๋Š” Roll ๋ฒ„ํŠผ ์œ„์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค. Compose๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UI ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

    ์ฆ‰ ๋จผ์ € ์„ ์–ธ๋œ ์ปดํฌ์ €๋ธ”์ด ๋จผ์ € ํ‘œ์‹œ๋œ๋‹ค. 

     

    ๋ฒ„ํŠผ๊ณผ ์ด๋ฏธ์ง€ ์‚ฌ์ด์˜ ๊ณต๊ฐ„์ด ๋น„์ข๋‹ค - > ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Spacer ์ปดํฌ์ €๋ธ”์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    Spacer์€ Modifier ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    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.*
    import androidx.compose.material.Button
    import androidx.compose.material.MaterialTheme
    import androidx.compose.material.Surface
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.ImageBitmap
    import androidx.compose.ui.input.key.Key.Companion.D
    import androidx.compose.ui.modifier.modifierLocalOf
    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 {
                    DiceRollerApp()
    
                }
            }
        }
    }
    @Preview
    @Composable
    fun DiceRollerApp() {
        DiceWithButtonAndImage(modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center))
            // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ด ์ตœ์†Œํ•œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋งŒํผ ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•œ๋‹ค
            //๊ตฌ์„ฑ์šง๋ฅผ ์„ธ๋กœ์™€ ๊ฐ€๋กœ๋กœ ๋ชจ๋‘ ์ค‘์•™์— ๋ฐฐ์น˜
    
    
    }
    
    //@Preview(showBackground = true)
    @Composable
    fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
        Column (
            modifier=modifier,
            //modifier ์ธ์ˆ˜๋Š” Column ํ•จ์ˆ˜์˜ ์ปดํฌ์ €๋ธ”์ด modifier ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•œ๋‹ค.  (?)
            horizontalAlignment = Alignment.CenterHorizontally
            //์—ด์ด ๋„ˆ๋น„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๊ธฐ ํ™”๋ฉด์˜ ์ค‘์•™์— ๋ฐฐ์น˜๋œ๋‹ค.
    
        ) {
            Image(painter = painterResource(R.drawable.dice_1), contentDescription = "1")
            Spacer(modifier = Modifier.height(16.dp))
            Button(onClick = {}) {
                Text(stringResource(R.string.roll))
            }
    
        } //Column body
    }//DiceWithButtonAndImage

    7. ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ ๋กœ์ง ๋นŒ๋“œ 

    ์ด์ œ ํ•„์š”ํ•œ ๋ชจ๋“  ์ปดํฌ์ €๋ธ”์ด ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„ํŠผ์„ ํƒญํ•˜๋ฉด ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๋„๋ก ์•ฑ์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค. 

    Button์„ ๋Œ€ํ™”ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ธฐ

    ๋žŒ๋‹ค ํ•จ์ˆ˜ ๊ณต๋ถ€ํ•˜๊ธฐ 

    ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ๋Š” ๋ฌด์ž‘์œ„์ด๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ๋žœ๋ค ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. 

    Kotlin์—์„œ๋Š” ์ˆซ์ž ๋ฒ”์œ„์— random() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

    Button์˜ onClick ๋žŒ๋‹ค ๋ณธ๋ฌธ์—์„œ resut ๋ณ€์ˆ˜๋ฅผ 1๋ถ€ํ„ฐ 6 ์‚ฌ์ด์˜ ๋ฒ”์œ„๋กœ ์„ค์ •ํ•˜๊ณ  ์ด ๋ฒ”์œ„์—์„œ random() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

     

    Button(onClick = {
        result = (1..6).random()
    }) {
        Text(stringResource(R.string.roll))
    }
    

    Dice Roller ์•ฑ์— ์กฐ๊ฑด๋ฌธ ์ถ”๊ฐ€

     result ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด 1 ๊ฐ’์œผ๋กœ ํ•˜๋“œ ์ฝ”๋”ฉ ํ•ด์ฃผ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ result ๋ณ€์ˆ˜์˜ ๊ฐ’์€ Roll ๋ฒ„ํŠผ์„ ํƒญํ•˜๋ฉด ์žฌ์„ค์ •๋˜๋ฏ€๋กœ ํ‘œ์‹œ๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค.

     

    ์ปดํฌ์ €๋ธ”์€ ๊ธฐ๋ณธ์ ์œผ๋กœ stateless์ด๋‹ค. ์ฆ‰ ๊ฐ’์„ ๋ณด์œ ํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์—์„œ ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ’์ด ์žฌ์„ค์ • ๋œ๋‹ค.  ๊ทธ๋Ÿฌ๋‚˜ Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ 

    ๊ตฌ์„ฑ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋Š” remember ์ปดํฌ์ €๋ธ”์„ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 

     

    remember ์ปดํฌ์ €๋ธ”์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค. mutableStateOf() ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ•จ์ˆ˜์— 1์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

    var result  by remember {
        mutableStateOf(1)
    }

    mutableStateOf() ํ•จ์ˆ˜๋Š” result ๋ณ€์ˆ˜ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์žฌ๊ตฌ์„ฑ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ  ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฐ˜์˜๋˜์–ด UI๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋œ๋‹ค.

    ์ด์ œ ๋ฒ„ํŠผ์„ ํƒญํ•˜๋ฉด result ๋ณ€์ˆ˜๊ฐ€ ๋žœ๋ค ์ˆซ์ž ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

     

    ๊ทธ๋Ÿฌ๋ฉด result ๋ณ€์ˆ˜ -> ํ‘œ์‹œํ•  ์ด๋ฏธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

     

    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
    }

     

    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.*
    import androidx.compose.material.Button
    import androidx.compose.material.MaterialTheme
    import androidx.compose.material.Surface
    import androidx.compose.material.Text
    import androidx.compose.runtime.*
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.graphics.ImageBitmap
    import androidx.compose.ui.input.key.Key.Companion.D
    import androidx.compose.ui.modifier.modifierLocalOf
    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 {
                    DiceRollerApp()
    
                }
            }
        }
    }
    @Preview
    @Composable
    fun DiceRollerApp() {
        DiceWithButtonAndImage(modifier = Modifier
            .fillMaxSize()
            .wrapContentSize(Alignment.Center))
            // ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์ด ์ตœ์†Œํ•œ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ๋งŒํผ ์ปค์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•œ๋‹ค
            //๊ตฌ์„ฑ์šง๋ฅผ ์„ธ๋กœ์™€ ๊ฐ€๋กœ๋กœ ๋ชจ๋‘ ์ค‘์•™์— ๋ฐฐ์น˜
    
    
    }
    
    //@Preview(showBackground = true)
    @Composable
    fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
        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,
            //modifier ์ธ์ˆ˜๋Š” Column ํ•จ์ˆ˜์˜ ์ปดํฌ์ €๋ธ”์ด modifier ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ถœ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•œ๋‹ค.  (?)
            horizontalAlignment = Alignment.CenterHorizontally
            //์—ด์ด ๋„ˆ๋น„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๊ธฐ ํ™”๋ฉด์˜ ์ค‘์•™์— ๋ฐฐ์น˜๋œ๋‹ค.
    
        ) {
            Image(painter = painterResource(id =imageResource), contentDescription = result.toString())
            Spacer(modifier = Modifier.height(16.dp))
            Button(onClick = {
                result = (1..6).random()
            }) {
                Text(stringResource(R.string.roll))
            }
    
        } //Column body
    }//DiceWithButtonAndImage
    

     

     

    DiceRoller ๊ฒฐ๊ณผํ™”๋ฉด.mp4
    0.05MB

     

    728x90