๊ฐœ๋ฐœ ์ผ์ง€ ๐Ÿ’ป/Nutri Capture

Nutri Capture ํ”„๋ก ํŠธ์—”๋“œ - Typography

interfacer_han 2024. 12. 28. 12:08

#1 ์ผ๊ด„์  ๊ธ€๊ผด ํ•„์š”

ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์“ฐ์ธ ๊ธ€์”จ์˜ ํฌ๊ธฐ๊ฐ€ ์ค‘๊ตฌ๋‚œ๋ฐฉ์ด๋ผ๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. ํ˜„์žฌ๋Š”, fontSize ์†์„ฑ์„ ์ง€๋‹Œ ์ปดํฌ์ €๋ธ”๋ณ„๋กœ ํฌ๊ธฐ๊ฐ’์„ ์ผ์ผํžˆ ํ• ๋‹นํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ์ „์ฒด์ ์œผ๋กœ ํ†ต์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํฌ๊ธฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฒ„ํŠผ์— ๋“ค์–ด๊ฐ€๋Š” ์šฉ๋„์˜ ๊ธ€๊ผด์„ ๋ณ„๋„๋กœ ์„ ์–ธํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‘๊ณ ๋‘๊ณ  ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ์•ž์œผ๋กœ ์ƒ๊ธธํ…Œ๋‹ค.

 

#2 Typography

#2-1 ๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ฐ€์ด๋“œ

 

Typography โ€“ Material Design 3

Learn about Material Design typography. This guide covers everything from font styles and hierarchy to line height to create user-friendly text.

m3.material.io

๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ผ๊ด„์ ์ธ ๊ธ€๊ผด์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํ†ตํ•ฉ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์—†์ด ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ ์ฝ”๋“œ๋‹ค.

 

#2-2 Typography ํ™œ์šฉ ์˜ˆ 1

Text(
    text = "Sample Top Bar Text",
    style = MaterialTheme.typography.headlineLarge
)

style ์†์„ฑ์— MaterialTheme.typography.headlineLarge (์ดํ•˜ headlineLarge)๋ผ๋Š” ๊ธ€๊ผด์„ ๋Œ€์ž…ํ•œ๋‹ค. ์ด ์ž‘์—…์€ ๋งˆ์น˜ HTML ํƒœ๊ทธ์— ๊ฐ€ํ•˜๋Š” css ์Šคํƒ€์ผ๊ณผ ๋น„์Šทํ•˜๋‹ค. ์ด์ œ๋ถ€ํ„ฐ, ์ด Text ์ปดํฌ์ €๋ธ”์€ headlineLarge์—์„œ ์„ ์–ธํ•œ ๋ชจ์–‘์ด ๋œ๋‹ค.

 

#2-3 Typography ํ™œ์šฉ ์˜ˆ 2

Text(
    text = "Sample Top Bar Text",
    fontSize = 20.sp,
    style = MaterialTheme.typography.headlineLarge
)

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” 1์ฐจ์ ์œผ๋กœ headlineLarge์—์„œ ์„ ์–ธํ•œ ๋ชจ์–‘์„ ์ ์šฉํ•œ ํ›„, 2์ฐจ์ ์œผ๋กœ fontSize๋ฅผ ์ ์šฉํ•œ๋‹ค. ์ฆ‰, fontSize ์†์„ฑ์ด ์šฐ์„ ํ•œ๋‹ค. ์ „์—ญ์ ์ธ ์„ค์ •๊ณผ ์ง€์—ญ์ ์ธ ์„ค์ •์ด ์ถฉ๋Œํ–ˆ์„ ๋•Œ๋Š” ์ด์™€ ๊ฐ™์ด ์ง€์—ญ์ ์ธ ์„ค์ •์„ ์šฐ์„ ํ•˜๋Š” ๊ฒŒ ๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ ๋ง์ด๋‹ค.

 

#2-4 ui.theme.Typography.kt 

// package com.example.nutri_capture_new.ui.theme

import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp

// Set of Material typography styles to start with
val Typography = Typography(
    bodyLarge = TextStyle(
        fontFamily = FontFamily.Default,
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp,
        lineHeight = 24.sp,
        letterSpacing = 0.5.sp
    )
    /* Other default text styles to override
    titleLarge = TextStyle(
        fontFamily = FontFamily.Default,
        fontWeight = FontWeight.Normal,
        fontSize = 22.sp,
        lineHeight = 28.sp,
        letterSpacing = 0.sp
    ),
    labelSmall = TextStyle(
        fontFamily = FontFamily.Default,
        fontWeight = FontWeight.Medium,
        fontSize = 11.sp,
        lineHeight = 16.sp,
        letterSpacing = 0.5.sp
    )
    */
)

Jetpack Compose ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ๋“ค์–ด์žˆ๋Š” ์ฝ”๋“œ๋‹ค. ์œ„์น˜๋Š” ui.theme ํŒจํ‚ค์ง€์˜ Type.kt ํŒŒ์ผ์ด๋‹ค. Typography ํด๋ž˜์Šค๋Š” bodyLarge, titleLarge, labelSmall, headlineMedium, displaySmall ๋“ฑ๋“ฑ์˜ ์ˆ˜ ๋งŽ์€ ๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ธ€๊ผด์„ ์ƒ์„ฑ์ž๋กœ์„œ ๋ฐ›๋Š”๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ๊ฐ ๊ธ€๊ผด์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ ์šฉ๋œ๋‹ค. ์ฆ‰, ๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ธ€๊ผด์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋˜ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋“ฏ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์–˜๊ธฐ๋‹ค.

 

๋‚ด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์•„์ง ๊ธ€๊ผด์„ ๋‹ค๋“ฌ๋Š” ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๊ธฐ์—, ์šฐ์„ ์€ Typography์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค. ๋˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋‚˜์œ ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ๋จธํ„ฐ๋ฆฌ์–ผ ๋””์ž์ธ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

#2-5 ์ฐธ๊ณ : Typography ํด๋ž˜์Šค

@Immutable
class Typography(
    val displayLarge: TextStyle = TypographyTokens.DisplayLarge,
    val displayMedium: TextStyle = TypographyTokens.DisplayMedium,
    val displaySmall: TextStyle = TypographyTokens.DisplaySmall,
    val headlineLarge: TextStyle = TypographyTokens.HeadlineLarge,
    val headlineMedium: TextStyle = TypographyTokens.HeadlineMedium,
    val headlineSmall: TextStyle = TypographyTokens.HeadlineSmall,
    val titleLarge: TextStyle = TypographyTokens.TitleLarge,
    val titleMedium: TextStyle = TypographyTokens.TitleMedium,
    val titleSmall: TextStyle = TypographyTokens.TitleSmall,
    val bodyLarge: TextStyle = TypographyTokens.BodyLarge,
    val bodyMedium: TextStyle = TypographyTokens.BodyMedium,
    val bodySmall: TextStyle = TypographyTokens.BodySmall,
    val labelLarge: TextStyle = TypographyTokens.LabelLarge,
    val labelMedium: TextStyle = TypographyTokens.LabelMedium,
    val labelSmall: TextStyle = TypographyTokens.LabelSmall,
) {
    ...
}

 

#3 ์ฝ”๋“œ

#2-2์˜ ์ฝ”๋“œ๋Œ€๋กœ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

 

#3-1 MainActivity.kt

...
import androidx.compose.material3.MaterialTheme
...

class MainActivity : ComponentActivity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        setContent {
            NutricapturenewTheme {
                ...

                Scaffold(
                    ...
                    topBar = {
                        TopAppBar(
                            title = {
                                Text(
                                    text = "Sample Top Bar Text",
                                    style = MaterialTheme.typography.headlineLarge
                                )
                            }
                        )
                    },
                    bottomBar = {
                        ...
                    },
                    snackbarHost = {
                        SnackbarHost(
                            ...
                            snackbar = { ...
                                Snackbar(
                                    ...
                                ) {
                                    Text(
                                        text = snackbarData.visuals.message,
                                        style = MaterialTheme.typography.bodyLarge,
                                    )
                                }
                            }
                        )
                    }
                ) { ...
                    ...
                }
            }
        }
    }

    ...
}

...

@Composable
fun SampleContent(
    ...
) {
    Box(
        ...
    ) {
        Button(
            ...
        ) {
            Text(
                text = text,
                style = MaterialTheme.typography.headlineMedium
            )
        }
    }
}

 

#3-2 NutrientScreen.kt

...
import androidx.compose.material3.MaterialTheme
...

@Composable
fun NutrientScreen(
    ...
) {
    ...

    LazyColumn(
        ...
    ) {
        item {
            FilledTonalButton(
                ...
            ) {
                Text(
                    text = "+",
                    style = MaterialTheme.typography.headlineMedium
                )
            }
        }

        ...
        items(...) { ...
            ...

            Card(
                ...
            ) {
                Box(
                    ...
                ) {
                    Column(
                        ...
                    ) {
                        Text(
                            text = DateFormatter.formatDateForNutrientScreen(dayMeal.date) + " " + dayMeal.time,
                            modifier = Modifier.fillMaxWidth(),
                            textAlign = TextAlign.End,
                            style = MaterialTheme.typography.labelLarge
                        )

                        Text(
                            text = "mealId: ${dayMeal.mealId}",
                            modifier = Modifier.fillMaxWidth(),
                            textAlign = TextAlign.Center,
                            style = MaterialTheme.typography.headlineMedium
                        )
                    }

                    ...
                }
            }
        }
    }
}

 

#4 ์™„์„ฑ๋œ ์•ฑ

#4-1 ์Šคํฌ๋ฆฐ์ƒท

๊ฒ‰๋ชจ์Šต์€ ๋‹ค๋ฅผ ๊ฒŒ ๊ฑฐ์˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ, ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ๋” ๊น”๋”ํ•ด์กŒ๋‹ค. ์ด ์‹œ์  ์ดํ›„๋กœ ๊ธ€์”จ ํฌ๊ธฐ๋ฅผ ์ง€์—ญ์ ์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ์ผ์ด ์—†๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

 

#4-2 ์ด ๊ฒŒ์‹œ๊ธ€ ์‹œ์ ์˜ Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com

 

#4-3 ๋ณธ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ€์žฅ ์ตœ์‹  Commit

 

GitHub - Kanmanemone/nutri-capture-new

Contribute to Kanmanemone/nutri-capture-new development by creating an account on GitHub.

github.com