[Compose]Example1-Layout

๐Ÿ‘‰๐Ÿป JetpackCompose๋Š” ๊ธฐ์กด์˜ xml๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ๋กœ UI๋””์ž์ธ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
JetpackCompose composes UI designs using Kotlin code, unlike the traditional XML method.

๐Ÿ‘‰๐Ÿป @Compose ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ปดํฌ์ฆˆ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
A function annotated with @Compose is called a compose.

๐Ÿ‘‰๐Ÿป ์ด ์ปดํฌ์ฆˆ๋ฅผ setContent {} ๋‚ด์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Run this compose inside setContent {}.

๐Ÿ‘‰๐Ÿป ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.
The code below is for the basic layout.

๐Ÿ‘‰๐Ÿป ๋‚˜๋จธ์ง€ ์„ค๋ช…์€ ์ฝ”๋“œ ์ฃผ์„์„ ์ฐธ์กฐํ•˜์„ธ์š”
Please refer to the code comments for the rest of the explanation.

package com.freelifemakers.jetpackexample1

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.freelifemakers.jetpackexample1.ui.theme.JetPackExample1Theme
import androidx.compose.ui.Alignment // Alignment import ์ถ”๊ฐ€
import androidx.compose.material3.TextField // add
import androidx.compose.foundation.layout.fillMaxWidth // add
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn // add
import androidx.compose.ui.graphics.Color // add
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

/*----------------------------------------------------------
* -์ปดํฌ์ฆˆ/Compose
* ํ•จ์ˆ˜์— @Composable ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€๊ฒƒ์€ ์ปดํฌ์ฆˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
*
*  -๋ ˆ์ด์•„์›ƒ
* ์ปฌ๋Ÿผ,๋กœ์šฐ(์Šคํฌ๋กค ์ ์šฉ)
*
* - Modifier
* Jetpack Compose์—์„œ Modifier๋Š” ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜๋ฅผ ๊พธ๋ฏธ๊ฑฐ๋‚˜
* ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•„์ˆ˜ ์š”์†Œ.
* XML ๋ ˆ์ด์•„์›ƒ์—์„œ์˜ ์†์„ฑ(Attribute)๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ํ›จ์”ฌ ๋” ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•จ.
*
*
* - Compose
* Functions annotated with @Composable can be used with Compose.
*
* - Layout
* Columns, Rows (scrolling)
*
* - Modifier
* In Jetpack Compose, modifiers are essential elements used to decorate composable functions or add functionality.
* They function similarly to attributes in XML layouts,
* but are much more flexible and powerful.
*
*
* -------------------------------------------------------------*/

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            JetPackExample1Theme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->

                    // ์Šคํฌ๋กค ์ƒํƒœ๋Š” Column ๋ฐ”๊นฅ์—์„œ ์„ ์–ธ
                    // Scroll state is declared outside the column
                    val scrollState = rememberScrollState()
                    Column(
                        modifier = Modifier
                            .fillMaxSize()
                            .verticalScroll(scrollState) // ์ปฌ๋Ÿผ์— ์Šคํฌ๋กค / scroll to column
                            .padding(innerPadding)

                    ){

                        // Welcome Message-default
                        Greeting(
                            name = "Android",
                            modifier = Modifier.padding(innerPadding)
                        )

                        // Column Layout
                        ColumnScrollExample(
                            modifier = Modifier.padding(innerPadding)
                        )

                        // Row Layout
                        RowLayoutExample(
                            modifier = Modifier.padding(innerPadding)
                        )

                        // Column Layout
                        ColumnLayoutExample(
                            modifier = Modifier.padding(innerPadding)
                        )

                        // Box Layout
                        TextExample("Box Alignment Example", fontSizeParam = 30.sp)
                        BoxAlignmentExample()

                        Spacer(modifier = Modifier.height(30.dp))

                        TextExample("Box Layering Example", fontSizeParam = 30.sp)
                        BoxLayeringExample()
                    }
                }
            }
        }
    }
}


// === ์ปดํฌ์ฆˆ ์˜์—ญ / Compose area ===

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    TextExample("Greeting Title")
    Text("Hellow $name")
}


@Composable
fun ColumnScrollExample(modifier: Modifier = Modifier) {
    val scrollState = rememberScrollState()

    Column(
    ) {
        TextExample("ColumScrollExample")
        for (i: Int in 1..20) {
            Text("$i")
        }
    }
}

@Composable
fun ColumnLayoutExample(modifier: Modifier) {
    Column(
        modifier = modifier,

        /* verticalArrangement: Arrangement.Vertical
         * Arrangement.Top (๊ธฐ๋ณธ๊ฐ’)
         * Arrangement.Center
         * Arrangement.Bottom
         * Arrangement.SpaceEvenly
         * Arrangement.SpaceAround
         * Arrangement.SpaceBetween
         */
        verticalArrangement = Arrangement.Top,

        /* horizontalAlignment: Alignment.Horizontal
         * Alignment.Start (๊ธฐ๋ณธ๊ฐ’)
         * Alignment.CenterHorizontally
         * Alignment.End
         */
        horizontalAlignment = Alignment.Start

    ) {
        Text("Column Layout Example")
        Text("1")
        Text("2")
        Text("3")
        Text("4")
        Text("5")
    }
}

@Composable
fun RowLayoutExample(modifier: Modifier = Modifier) {
    Row (
        modifier = modifier,

        /* horizontalArrangement: Arrangement.Horizontal
         * Arrangement.Start (๊ธฐ๋ณธ๊ฐ’)
         * Arrangement.Center
         * Arrangement.End
         * Arrangement.SpaceEvenly
         * Arrangement.SpaceAround
         * Arrangement.SpaceBetween
         */
        horizontalArrangement = Arrangement.Start,
        /* verticalAlignment: Alignment.Vertical
         * Alignment.Top (๊ธฐ๋ณธ๊ฐ’)
         * Alignment.CenterVertically
         * Alignment.Bottom
         */
        verticalAlignment = Alignment.Top
    ){
        Text("RowLayoutExample")
        Text("1")
        Text("2")
        Text("3")
        Text("4")
        Text("5")
    }
}

@Composable
fun BoxAlignmentExample() {
    // ํ…์ŠคํŠธ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก Box์— ์ถฉ๋ถ„ํ•œ ํฌ๊ธฐ ํ™•๋ณด.
    // Make sure the Box is large enough to avoid overlapping text.
    Box(
        modifier = Modifier
            .fillMaxWidth() // ๊ฐ€๋กœ๋ฅผ ์ตœ๋Œ€๋กœ ์ฑ„์šฐ๊ธฐ / Fill the width to the maximum
            .height(400.dp) // ๊ณ ์ •๋œ ๋†’์ด ์ง€์ • / Specify a fixed height
            .background(Color.LightGray) // Box์˜ ์˜์—ญ์— ๊ฒฝ์ƒ‰ ์ถ”๊ฐ€ / Add a hard border to the box area
            .padding(8.dp) // Box ๋‚ด๋ถ€์˜ ์—ฌ๋ฐฑ / Margin inside the box
    ) {
        val fontSize = 16.sp

        // Modifier.align()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Box ๋‚ด๋ถ€์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
        // Use Modifier.align() to position it inside the Box.
        Text(
            text = "TopStart",
            modifier = Modifier.align(Alignment.TopStart),
            fontSize = fontSize
        )
        Text(
            text = "TopCenter",
            modifier = Modifier.align(Alignment.TopCenter),
            fontSize = fontSize
        )
        Text(
            text = "TopEnd",
            modifier = Modifier.align(Alignment.TopEnd),
            fontSize = fontSize
        )

        Text(
            text = "CenterStart",
            modifier = Modifier.align(Alignment.CenterStart),
            fontSize = fontSize
        )
        Text(
            text = "Center",
            modifier = Modifier.align(Alignment.Center),
            fontSize = fontSize,
            textAlign = TextAlign.Center
        )
        Text(
            text = "CenterEnd",
            modifier = Modifier.align(Alignment.CenterEnd),
            fontSize = fontSize
        )

        Text(
            text = "BottomStart",
            modifier = Modifier.align(Alignment.BottomStart),
            fontSize = fontSize
        )
        Text(
            text = "BottomCenter",
            modifier = Modifier.align(Alignment.BottomCenter),
            fontSize = fontSize
        )
        Text(
            text = "BottomEnd",
            modifier = Modifier.align(Alignment.BottomEnd),
            fontSize = fontSize
        )
    }
}

@Composable
fun BoxLayeringExample() {
    Box(
        modifier = Modifier
            .size(200.dp) // ํฌ๊ธฐ ์ง€์ • / Specify size
            .background(Color.White) // ๋ฐฐ๊ฒฝ์ƒ‰ / Background Color
    ) {
        // ๊ฐ€์žฅ ์•„๋ž˜ ๊น”๋ฆฌ๋Š” ์š”์†Œ (ํฐ ์‚ฌ๊ฐํ˜•)
        // The bottommost element (large square)
        Spacer(
            modifier = Modifier
                .size(150.dp)
                .align(Alignment.Center) // ์ค‘์•™ ์ •๋ ฌ / center alignment
                .background(Color.Blue)
        )

        // ๊ฒน์ณ์ง€๋Š” ์š”์†Œ (์ž‘์€ ์‚ฌ๊ฐํ˜•)
        // Overlapping elements (small squares)
        Spacer(
            modifier = Modifier
                .size(100.dp)
                .align(Alignment.Center)
                .background(Color.Red)
        )

        // ๊ฐ€์žฅ ์œ„์— ํ‘œ์‹œ๋˜๋Š” ์š”์†Œ (ํ…์ŠคํŠธ)
        // The topmost element (text)
        Text(
            text = "Overlap Text",
            color = Color.White,
            fontSize = 20.sp,
            modifier = Modifier
                .align(Alignment.Center)
                .padding(top = 10.dp)
        )
    }
}

@Composable
fun TextExample(
    name: String,
    modifier: Modifier = Modifier,
    fontSizeParam: TextUnit = 40.sp
) {
    Text(
        text = "$name",
        modifier = modifier,
        fontSize = fontSizeParam,
        textAlign = TextAlign.Center
    )
}

// === ํ”„๋ฆฌ๋ทฐ ์˜์—ญ / Preview Area===
// @Composable ํ•จ์ˆ˜์—๋Š” @Preview๋ฅผ ๋‹ฌ ์ˆ˜ ์žˆ๋‹ค.

@Preview(showBackground = true)
@Composable
fun GreetingWithDefaultParameter(name: String = "Default Parameter") {
    Text(
        text = "Hello world!"
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingWithNoParameter() {
    Text(
        text = "Hello MyApp"
    )
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    JetPackExample1Theme {
        Greeting("Android")
    }
}

์Šคํฌ๋ฆฐ ์ƒท / Screen Shot

Leave a Reply

Your email address will not be published. Required fields are marked *