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

Unit 2- 2 Lemonade ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ

by hyeonha 2023. 1. 10.

๋ชฉ์ฐจ

    https://hanyeop.tistory.com/260

     

    [Android] Jetpack Compose ์ œํŠธํŒฉ ์ปดํฌ์ฆˆ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ - (2) ๊ธฐ์ดˆ ์‚ฌ์šฉ๋ฒ•

    2021.08.10 - [์•ˆ๋“œ๋กœ์ด๋“œ/Jetpack-Compose] - [Android] Jetpack Compose ์ œํŠธํŒฉ ์ปดํฌ์ฆˆ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ - (1) ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ [Android] Jetpack Compose ์ œํŠธํŒฉ ์ปดํฌ์ฆˆ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ - (1) ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ https://android-developers.googleblog

    hanyeop.tistory.com

    1. ์šฐ์„  ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ณธ ํ™”๋ฉด์„ ํด๋ฆญํ•˜๋ฉด ๋‘ ๋ฒˆ์จฐ๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ํ•œ๋‹ค.  

     

     

    2. ๊ธฐ๋ณธ ๋กœ์ง ๊ตฌํ˜„ํ•œ๋‹ค. 

     

     


    3. ๊ธฐ๋ณธ ๋กœ์ง ์ค‘ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ (Column ๋ถ€๋ถ„) ์„ LemonTextAndImage๋กœ ๋ฐ”๊พผ๋‹ค.  ->>>>>>>>>>๋ชจ๋ฅด๊ฒ ๋‹ค 

    @Composable
    fun LemonTextAndImage(
        textResource : Int,
        drawableResource : Int,
        //contentResource: Int,
        onImageClick:() -> Unit,
        modifier: Modifier = Modifier
    ){
        Column (
            modifier = Modifier.fillMaxSize(),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center,
        ){
            Text(text = stringResource(textResource)
                , fontSize = 18.sp)
            Spacer(modifier = Modifier.height(16.dp))
            Image(painter = painterResource(drawableResource),
                contentDescription = "1",
                modifier = Modifier
                    .wrapContentSize()
                    .clickable(onClick = onImageClick)
                    .border(
                        BorderStroke(2.dp, Color(105, 205, 216)),
                        shape = RoundedCornerShape(4.dp)
                    )
                    .padding(16.dp)
            )
        }//Column body
    
    }
    

    LemonTextAndImage() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ textResource: Int, ํ˜•ํƒœ๋กœ ์ฃผ๋Š”๋ฐ ์ด ๋•Œ

     R.string.select ๊ฐ™์€ ๊ฒƒ์€ Int ํ˜•ํƒœ์ด๋‹ค. 

    ๊ทผ๋ฐ onImageClick : () -> Unit ์ด ํ˜•ํƒœ ์ฐธ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ„๋‹ค.


     

    4.  ์‚ฌ์šฉ์ž๊ฐ€ ๋ ˆ๋ชฌ์„ ์••์ฐฉ(ํƒญ)ํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๋Š” 2์™€ 4 ์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž์—ฌ์•ผ ํ•œ๋‹ค.

    ์ด ๋žœ๋ค ์ˆซ์ž๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚˜๋ฌด์—์„œ ๋ ˆ๋ชฌ์„ ์ƒˆ๋กœ ์„ ํƒํ•  ๋•Œ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง„๋‹ค. 

     

    1 -> {
        LemonTextAndImage(R.string.select,R.drawable.lemon_tree,
        onImageClick = {
            currentStep= 2
            squeezeCount = (2..4).random()
        })
    } //1

    step2์—์„œ๋Š” 2์™€ 4 ์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž๋ฅผ ์ฃผ์–ด์„œ ํ•ด๋‹น ์ˆ˜ ๋งŒํผ ํƒญ์„ ํ•œ ๋’ค์— step3๋กœ ๋„˜์–ด๊ฐ„๋‹ค. 

     

    https://developer.android.com/jetpack/compose/modifiers-list#Border

    ํ…Œ๋‘๋ฆฌ ์ถ”๊ฐ€ 

     

    Compose ์ˆ˜์ •์ž ๋ชฉ๋ก  |  Jetpack Compose  |  Android Developers

    Compose ์ˆ˜์ •์ž ๋ชฉ๋ก ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. ์ž‘์—… ๋ฒ”์œ„: ๋ชจ๋‘ ์ž…๋ ฅ ๋˜๋Š” ์ ‘๊ทผ์„ฑ 'ํด๋ฆญ' ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ํด๋ฆญ์ด ๋ฐœ์ƒํ•˜๋„๋ก ๊ตฌ์„ฑ์š”์†Œ๋ฅผ

    developer.android.com

    modifier = Modifier
        .wrapContentSize()
        .clickable(onClick = onImageClick)
        .border(
            BorderStroke(2.dp, Color(105, 205, 216)),
            shape = RoundedCornerShape(4.dp)
        )
        .padding(16.dp)

    modifier.border() ๋ฅผ ํ†ตํ•ด ํ…Œ๋‘๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. 


    ์ „์ฒด 

    package com.example.lemonade
    
    import android.graphics.Paint.Align
    import android.os.Bundle
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.compose.foundation.BorderStroke
    import androidx.compose.foundation.Image
    import androidx.compose.foundation.border
    import androidx.compose.foundation.clickable
    import androidx.compose.foundation.layout.*
    import androidx.compose.foundation.shape.RoundedCornerShape
    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.Color
    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 androidx.compose.ui.unit.sp
    import com.example.lemonade.ui.theme.LemonadeTheme
    
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                LemonadeTheme {
                    LemonApp()
                }
            }
        }
    }
    
    @Composable
    fun LemonTextAndImage(
        textResource : Int,
        drawableResource : Int,
        //contentResource: Int,
        onImageClick:() -> Unit,
        modifier: Modifier = Modifier
    ){
        Column (
            modifier = Modifier.fillMaxSize(),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center,
        ){
            Text(text = stringResource(textResource)
                , fontSize = 18.sp)
            Spacer(modifier = Modifier.height(16.dp))
            Image(painter = painterResource(drawableResource),
                contentDescription = "1",
                modifier = Modifier
                    .wrapContentSize()
                    .clickable(onClick = onImageClick)
                    .border(
                        BorderStroke(2.dp, Color(105, 205, 216)),
                        shape = RoundedCornerShape(4.dp)
                    )
                    .padding(16.dp)
            )
        }//Column body
    
    }
    
    
    @Composable
    fun LemonApp() {
        var currentStep by remember {
            mutableStateOf(1)
        }
    
        var squeezeCount by remember{
            mutableStateOf(0)
        }
        // A surface container using the 'background' color from the theme
        Surface(
            modifier = Modifier.fillMaxSize(),
            color = MaterialTheme.colors.background
        ) {
    
            //์กฐ๊ฑด๋ฌธ์— ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€์™€ ํƒ์ŠคํŠธ ๋ณด์—ฌ์ฃฝ
            when(currentStep) {
                1 -> {
                    LemonTextAndImage(R.string.select,R.drawable.lemon_tree,
                    onImageClick = {
                        currentStep= 2
                        squeezeCount = (2..4).random()
                    })
                } //1
                2 -> {
                    LemonTextAndImage(R.string.select,R.drawable.lemon_squeeze,
                    onImageClick = {
                        squeezeCount -- // ํ•œ๋ฒˆ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค squeezeCount ํ•˜๋‚˜์”ฉ ๊ฐ์†Œ
                        if(squeezeCount==0){  // ๊ณ„์† ํƒญ ํ•˜๋‹ค๊ฐ€  0์ด ๋˜๋ฉด 3๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
                            currentStep = 3
                        } //if
                    })
                } //2
    
                3->{
                    LemonTextAndImage(
                        textResource = R.string.drink,
                        drawableResource =R.drawable.lemon_drink ,
                        onImageClick = {
                            currentStep=4
                        })
                } //3
    
                4 -> {
                    LemonTextAndImage(
                        textResource = R.string.restart,
                        drawableResource = R.drawable.lemon_restart,
                        onImageClick = {
                            currentStep =1
    
                        })
                }//4
            } //when
    
        }  //Surface์˜ body
    }
    
    @Preview(showBackground = true)
    @Composable
    fun DefaultPreview() {
        LemonadeTheme {
            LemonApp()
        }
    }

    ์—ฌ๊ธฐ์„œ๋„ onImageClick = {  } ํ˜•ํƒœ ์ดํ•ดํ•˜๊ธฐ  

    728x90