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

Android ์•ฑ์— ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ 6~

by hyeonha 2022. 11. 16.

๋ชฉ์ฐจ

    6. ์ด๋ฏธ์ง€ ์ปดํฌ์ €๋ธ”์˜ ์œ„์น˜ ์ง€์ • ๋ฐ ํฌ๊ธฐ ์กฐ์ •

    ์ด๋ฏธ์ง€๋ฅผ ์ „์ฒด ํ™”๋ฉด ํฌ๊ธฐ๋กœ ์กฐ์ •ํ•˜์—ฌ ์•ฑ์„ ๊พธ๋ฉฐ๋ณด์ž! ์ด๋ฅผ ์œ„ํ•ด Modifier ๋ฐ ContentScale ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.  

    ์ˆ˜์ •์ž

    ์ˆ˜์ •์ž๋Š” Jetpack Compose UI์š”์†Œ๋ฅผ ์žฅ์‹ํ•˜๊ฑฐ๋‚˜ ์ด ์š”์†Œ์— ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ํ–‰์ด๋‚˜ ํ…์ŠคํŠธ, ๋ฒ„ํŠผ์— ๋ฐฐ๊ฒฝ์ด๋‚˜ ํŒจ๋”ฉ, ๋™์ž‘์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์„ค์žฅํ•˜๋ ค๋ฉด ์ปดํฌ์ €๋ธ”์ด ์ˆ˜์ •์ž๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด Text ์ปดํฌ์ €๋ธ”์—๋Š” ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ๋…น์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” Modifier ์ธ์ˆ˜๊ฐ€ ์•˜๋‹ค.

    Text(
        text = "Hello, World!",
        // Solid element background color
        modifier = Modifier.background(color = Color.Green)
    )

     ์ด์ œ Image ์ปดํฌ์ €๋ธ”์— Modifier ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž

    ์ปดํฌ์ €๋ธ”์˜ ๋†’์ด๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋†’์ด๋กœ ์„ค์ •๋œ๋‹ค. 

    1. BirthdayGreetingWithImage() ํ•จ์ˆ˜์—์„œ Image ์ปดํฌ์ €๋ธ”์— modifier๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  Modifier.fillMaxHeight() ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค.
    @Composable
    fun BirthdayGreetingWithImage(message: String,from: String) {
        val image = painterResource(R.drawable.androidparty)
        //Box ๋ ˆ์ด์•„์›ƒ ์ถ”๊ฐ€
        Box {
    
            Image(
                painter = image, 
                contentDescription = null,
                modifier = Modifier.fillMaxHeight()
            )
            BirthdayGreetingWithText(message = message, from = from)
        }
    
    }

    Android ์ŠคํŠœ๋””์˜ค์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด

    androidx.compose.foundation.layout.fillMaxHeight ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

     2.  .fillMaxWidth() ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •์ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.   

    ํ•œ๋ฒˆ์— ๋‘˜ ์ด์ƒ์˜ ์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •์ž ํ˜ธ์ถœ์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    Android ์ŠคํŠœ๋””์˜ค์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด 

    androidx.compose.foundation.layout.fillMaxWidth ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

     

    ์ฝ˜ํ…์ธ  ์กฐ์ •

    ์ด์ œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋ฏธ์ง€์˜ ๋ฐฐ์œจ ์œ ํ˜•์„ ์กฐ์ •ํ•˜์—ฌ ์ „์ฒด ํ™”๋ฉด์ด ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

    ์—ฌ๋Ÿฌ ContentScale ์œ ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค. ContentScale.Crop ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์œจ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    ์ด๋Š” ์ด๋ฏธ์ง€์˜ ๋„ˆ๋น„์™€ ๋†’์ด๊ฐ€ ๋‹ค์Œ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ์ƒ์‘ํ•˜๋Š” ํ™”๋ฉด์˜ ํฌ๊ธฐ์™€ ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋„๋ก ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ๊ท ์ผํ•˜๊ฒŒ ์กฐ์ •ํ•œ๋‹ค. 

     

    Image(
        painter = image,
        contentDescription = null,
        modifier = Modifier
            .fillMaxHeight()
            .fillMaxWidth(),
        contentScale = ContentScale.Crop
    )

    1. Image์— ContentScale ์ธ์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

    2.Android ์ŠคํŠœ๋””์˜ค์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด androidx.compose.ui.layout.ContentScale ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

     

    ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

    7. ํ…์ŠคํŠธ ์ •๋ ฌ ๋ฐ ํŒจ๋”ฉ ์ถ”๊ฐ€

    ์ด์ œ ๋ฌธ์ž ๋ฉ”์‹œ์ง€์— ํŒจ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์•ฑ์„ ๋” ์•„๋ฆ„๋‹ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

    
    @Composable
    fun BirthdayGreetingWithText(message: String, from: String) {
        Column{
            Text(
                text = message,
                fontSize = 32.sp,
                modifier = Modifier
                    .fillMaxWidth()
                    .wrapContentWidth(Alignment.Start)
            )
            Text(
                text = from,
                fontSize = 24.sp
            )
        }
    

    1. Text ์ปดํฌ์ €๋ธ”์ธ ์ƒ์ผ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ๋Š”๋‹ค. 

    2. Modifier.fillMaxWidth() ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค. -> ์ปดํฌ์ €๋ธ”์˜ ๋„ˆ๋น„๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋„ˆ๋น„๋กœ ์„ค์ •๋œ๋‹ค.

    3. .wrapContentWidth()๋ฅผ Modifier ์— ์—ฐ๊ฒฐํ•œ๋‹ค. -> ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ™”๋ฉด ๋„ˆ๋น„(๋˜๋Š” ์ƒ์œ„ ๋„ˆ๋น„) ์— ์ปดํฌ์ €๋ธ”์ด ๋ž˜ํ•‘๋˜๊ณ  ์ •๋ ฌ๋œ๋‹ค.

    4. .wrapContentWidth() ํ•จ์ˆ˜์— Alignment.Start ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. -> Text ์ปดํฌ์ €๋ธ” ๋˜๋Š” ํ•˜์œ„ ์š”์†Œ๊ฐ€ ํ™”๋ฉด์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ ๋˜๋Š” ์ƒ์œ„ ์š”์†Œ์— ๋งž์ถฐ์„œ ์ •๋ ฌ๋œ๋‹ค. 

     

    compose.ui ํŒจํ‚ค์ง€์—์„œ androidx.compose.ui.Alignment ์†์„ฑ์„ ๊ฐ€์ ธ์˜จ๋‹ค.

     

    ํŒจ๋”ฉ

    UI์š”์†Œ๋Š” ์ฝ˜ํ…์ธ  ์ฃผ์œ„๋กœ ๋ž˜ํ•‘๋œ๋‹ค. ๋„ˆ๋ฌด ๋น„์ข๊ฒŒ ๋ž˜ํ•‘๋˜์ง€ ์•Š๋„๋ก ๊ฐ ๋ฉด์˜ ํŒจ๋”ฉ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ํŒจ๋”ฉ์€ ์ˆ˜์ •์ž(modifier)๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์ปดํฌ์ €๋ธ”์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ์ €๋ธ”์˜ ๊ฐ ๋ฉด์˜ ๊ฒฝ์šฐ padding ์ˆ˜์ •์ž๋Š” ํŒจ๋”ฉ ๊ฐ’์„ ์ •์˜ํ•˜๋Š” ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

    1. Modifier์— .padding() ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ์—ฐ๊ฒฐํ•˜๊ณ  16.dp๋กœ ์„ค์ •๋œ start๋ผ๋Š” ์ธ์ˆ˜์™€ 16.dp๋ผ๊ณ  ์„ค์ •๋œ top์ด๋ผ๋Š” ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 

    Text(
       text = message,
       fontSize = 36.sp,
       modifier = Modifier
           .fillMaxWidth()
           .wrapContentWidth(Alignment.Start)
           .padding(start = 16.dp, top = 16.dp)
    )
    import androidx.compose.ui.unit.dp

    2. Android ์ŠคํŠœ๋””์˜ค์—์„œ ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉด ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

    androidx.compose.foundation.layout.padding

    3. ํ™•์ธ

     

    4. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ช…์„ ํ™”๋ฉด ๋ ๋ถ€๋ถ„์— ๋งž์ถฐ์„œ ์ •๋ ฌํ•œ๋‹ค. ๋˜ํ•œ ์‹œ์ž‘๊ณผ ๋ ๋ถ€๋ถ„์— ํŒจ๋”ฉ 16.dp๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 

    8. ์ ์ ˆํ•œ ์ฝ”๋“œ ์‚ฌ๋ก€ ์ฑ„ํƒ

    ๋ฒˆ์—ญ

    ์•ฑ์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํŠน์ • ์‹œ์ ์— ๋‹ค๋ฅด์–ธ์–ด๋กœ ๋ฒˆ์—ญ๋  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค.

    String ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ " Happy Birthday, Sam!" ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ๋ฌธ์ž์ด๋‹ค. ํ•˜๋“œ ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์€ ์•ฑ ์ฝ”๋“œ์— ์ง์ ‘ ์ž‘์„ฑ๋œ ๋ฌธ์ž์—ด์ด๋‹ค. ํ•˜๋“œ ์ฝ”๋”ฉ ๋ฌธ์ž์—ด๋กœ ์ธํ•ด ์•ฑ์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๊ณ  ์•ฑ์˜ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ๋ฌธ์ž์—ด์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ํž˜๋“ค๋‹ค. ๋ฌธ์ž์—ด์„ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. 

    ์ฝ”๋“œ์—์„œ ๋ฌธ์ž์—ด์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ฌธ์ž์—ด์„ ํŒŒ์ผ์— ๋„ฃ๊ณ  ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ ํ›„ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฆ„์€ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

    1. MainActivity.kt ํŒŒ์ผ์—์„œ onCreate() ํ•จ์ˆ˜๋กœ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ผ ์ถ•ํ•˜ ๋ฉ”์‹œ์ง€ Happy Birthday Sam! ๋ฌธ์ž์—ด์„ ์„ ํƒํ•ฉ
    2.  ํ™”๋ฉด ์™ผ์ชฝ์— ์žˆ๋Š” ์ „๊ตฌ๋ฅผ ํด๋ฆญํ•œ๋‹ค.
    3. Extract string resource๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ์ด์ œ ํ•˜๋“œ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์ด stringResource() ํ•จ์ˆ˜๋กœ ๋Œ€์ฒด๋œ๋‹ค.

    Content {
                HappyBirthdayTheme {
                    // A surface container using the 'background' color from the theme
                    Surface(color = MaterialTheme.colors.background){
                       BirthdayGreetingWithImage(message = getString(R.string.happy_birthday_text), from = "-from Emma")
                }
                }

    7. Project ์ฐฝ์—์„œ app > res> values > strings.xml ๊ฒฝ๋กœ์˜ strings.xml์„ ์—ด๋ฉด Android ์ŠคํŠœ๋””์˜ค์— happy_birthday_text ๋ผ๋Š” ๋ฌธ์ž์—ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    8. ๋™์ผํ•œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ Text ์ปดํฌ์ €๋ธ”์˜ ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•œ๋‹ค. 

    @Preview(showBackground = true)
    @Composable
    fun BirthdayCardPreview() {
        HappyBirthdayTheme {
            BirthdayGreetingWithImage(message = "Happy Birthday Sam!", stringResource(R.string.signature_text))
        }
    }

     

    728x90