[Android] Jetpack Compose UI Component

![スクリーンショット 2024-01-09 21.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/e6dde330-a4a8-9ea6-70ac-2efc6cb99d35.png)

# Jetpack Compose UIとは？

</br>

宣言型UIパラダイムに基づき、開発者がより直感的で簡潔な方法でAndroidアプリのUIを設計できるようにするもので、Kotlinを使用してUIコンポーネントを作成し、状態の変化に応じてUIが自動的に更新される。

</br>

### 長所

* ```宣言型UI```：UIの状態に基づいてUIを宣言し、状態が変化するとシステムがUIを自動的に更新する。
* ```簡潔さ```：Kotlin DSLを使用して、より少ないコードでより多くの作業を行うことができる。
* ```コンポジション```：小さなコンポーネントを組み合わせて複雑なUIを実装することができる。
* ```再利用性```：カスタムコンポーネントを簡単に作成して再利用することができる。
* ```互換性```：既存のビューシステムと共に使用することができ、段階的に移行することができる。

### 短所

 * ```ライブラリ及びツールのサポート```：すべてのライブラリがJetpack Composeを完全にサポートしていない場合がある。
 
* 従来の方法との比較 :
    * ```従来の方法 (XMLベースのビュー)```：レイアウトXMLファイルを使用してUIを定義し、アクティビティやフラグメントでビューを操作する。UIとビジネスロジックが分離されておらず複雑である。
    * ```Jetpack Compose```：UIと関連するロジックがKotlinファイル内で密接に結合されており、より動的で反応的なUIを提供する。


これ以外にも様々な点があるが、現在は数多くのアプリがJetpack Compose UIで宣言型UIで開発を行っており、より多くのJetpackの勉強をしている。

</br>


# 全体的な構成
</br>

### MainActivity

```kotlin
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            HelloWorldTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}
```

  
 * ```HelloWorldTheme```: 基本提供されるMaterialテーマで、アプリ名によって決定され、様々なデザインとカラースキームを提供する。

 * ```Greeting```: Greeting関数を呼び出し、この関数は"Android"という文字列を引数として受け取る。
</br>

### 関数呼び出し

上で宣言した関数を呼び出し、この関数は@Composableアノテーションが適用された関数で、UI要素を構成する。

```kotlin
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        color = Color.Red,
        text = "Hello $name!\nHello $name!",
        fontSize = 130.sp,
        fontWeight = FontWeight.Bold,
        textAlign = TextAlign.Center,
        modifier = modifier.size(300.dp),
    )
}
``` 

</br>

### プレビュー関数
Android Studioでレイアウトのプレビューを提供し、この関数はデザインタイムにUIを確認することができるようにする。

  ```kotlin
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    HelloWorldTheme {
        Greeting("Android")
    }
}
  ```

  
# 基本コンポーネントの使用

Material3デザインを基にして作成したコンポーネントの例

</br>

### Text
画面にテキストを表示し、様々なスタイリングオプションを提供してテキストの外観を定義する。


  ```kotlin
@Composable
fun TextExmaple() {
    Text(
        "TextExmaple",
        color = Color.Red,
        fontSize = 30.sp,
        fontWeight = FontWeight.Bold,
        textAlign = TextAlign.Center,
        textDecoration = TextDecoration.Underline,
    )
}

  ```
  

![](https://velog.velcdn.com/images/rmsxo5678/post/deec97e9-b91e-4a0b-8184-5e63f858aaca/image.png)
 
 
</br>

### Button
ユーザーの対話のためのボタンを提供し、onClickラムダを通じてクリックイベントを処理することができる。


  ```kotlin
@Composable
fun ButtonExample(onButtonClicked: () -> Unit) {
     Button(
        onClick = onButtonClicked
    ) {
        Text("クリックしてください")
    }
}

  ```
![スクリーンショット 2024-02-26 3.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/455ade30-c802-6f43-81ee-2ddb42970c94.png)

 
 
</br>

### Image
画像を表示する。ローカルリソースや外部URLから画像をロードすることができる。


  ```kotlin
@Composable
fun ImageExample() {
    Image(
        painter = painterResource(id = R.drawable.my_image),
        contentDescription = "Image"
    )
}
  ```
 
 ![](https://velog.velcdn.com/images/rmsxo5678/post/d32f9270-9411-4502-a178-555c27156a3c/image.png)

 
</br>


### Modifier
ComposeのすべてのUI要素に共通して適用できる設定を担当し、サイズ、配置、パディング、クリックイベントなど様々なUI調整を行うことができる。


```kotlin
@Composable
fun ModifierExample() {
    Text(
        "Modifier 例",
        modifier = Modifier
                .offset(x = 10.dp)
                .background(Color.Blue)
    )
}
```
 
![スクリーンショット 2024-02-26 3.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/11f8fa74-5a88-767b-63d1-d936060574c8.png)

</br>


### Surface
UIの基本的なコンテナーの役割を果たし、背景色、形状、影などを定義することができる。

  ```kotlin
@Composable
fun SurFaceExample() {

    Surface(
        modifier = Modifier.padding(5.dp),
        color = MaterialTheme.colorScheme.secondary
    ) {
        Text(
            text = "Hello",
            modifier = Modifier.padding(8.dp)
        )
    }
}
  ```
  
  ![](https://velog.velcdn.com/images/rmsxo5678/post/af08844d-ef5c-4610-abea-8deb63d93115/image.png)
 
 
</br>


### Box
他のコンポーネントを重ねて配置できるコンテナで、Z軸（深さ）の順序で子を配置する。


  ```kotlin
@Composable
fun BoxExample() {
    Box {
        Box(
            modifier = Modifier
                .size(70.dp)
                .background(Color.Magenta)
                .align(Alignment.BottomEnd)
        )
    }
}

  ```
  
![](https://velog.velcdn.com/images/rmsxo5678/post/5c6c4695-8897-49de-bc19-bf2709a9d376/image.png)
 
</br>


### Row
子コンポーネントを水平に配置するレイアウト

![](https://velog.velcdn.com/images/rmsxo5678/post/b3f9944e-dd45-4f6b-8cfe-283f4f988bb2/image.png)


```kotlin
@Composable
fun RowExample() {
    Row(
        verticalAlignment = Alignment.Top,
        modifier = Modifier.fillMaxWidth().padding(16.dp)
    ) {
        Text(
            text = "Hi",
            textAlign = TextAlign.Center,
            modifier = Modifier
                .weight(3f)
                .background(Color.Magenta)
        )
    }

}
```
 ![](https://velog.velcdn.com/images/rmsxo5678/post/60fbf77b-c619-4e6e-8e8a-ff19bd91bd22/image.png)
 
</br>


### Column
子コンポーネントを垂直に配置するレイアウト

![](https://velog.velcdn.com/images/rmsxo5678/post/543894c3-77c7-4df3-adb0-91938a712327/image.png)



  ```kotlin
@Composable
fun ColumnExample() {
    Column(
        horizontalAlignment = Alignment.End,
        verticalArrangement = Arrangement.Center,
        modifier = Modifier.size(100.dp),
    ) {
        Text(
            text = "Hi",
            modifier = Modifier.align(Alignment.CenterHorizontally)
        )
    }
}

  ```
  
![](https://velog.velcdn.com/images/rmsxo5678/post/5cc02d22-e799-4f7f-96e2-991fe711dd60/image.png)

</br>


### BoxWithConstraints
自分の最大および最小制約を知ることができるBoxで、これを通じて親のサイズに応じて異なる動作をするUIを作ることができる。


  ```kotlin
@Composable
fun BoxWithConstraintsExample() {
	BoxWithConstraints {
		val constraints = if (maxWidth < 400.dp) "小さい画面" else "大きい画面"
		Text(constraints)
	}
}

  ```
![スクリーンショット 2024-02-26 3.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/4437ac09-876d-c818-56c7-885a3c7533d7.png)

 
</br>


### CheckBox
チェックボックスUI要素で、ユーザーが選択/解除することができる。


  ```kotlin
@Composable
fun CheckboxExample() {
	var checked by remember { mutableStateOf(false) }
	Row(verticalAlignment = Alignment.CenterVertically) {
		Checkbox(checked = checked, onCheckedChange = { checked = it })
		Text("チェックボックス")
    }
}

  ```
![スクリーンショット 2024-02-26 3.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/46c9b46a-2da4-e800-0390-89bade17211c.png)

 
</br>

### TextField
ユーザーからのテキスト入力を受けるフィールドで、様々なスタイリングとテキスト処理オプションを提供する。


```kotlin
@Composable
fun TextFieldExample() {
    var name by remember { mutableStateOf("rmsxo") }
    Column(modifier = Modifier.padding(16.dp)) {

        TextField(
            value = name,
            label = {
                    Text("名前")
            },
            onValueChange = { name = it }
        )
        Spacer(modifier = Modifier.size(8.dp))
        Text(text = "ハロー $name")
    }

}
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639815/0fbb37c5-791c-b9d9-5237-0c860e422dca.png)

</br>

## *まとめ*


現在、Jetpack ComposeはAndroid UI開発のパラダイムを変革している。
宣言型UIアプローチを採用したJetpack Composeは、開発プロセスを単純化し、コードの可読性を向上させるが、新しい技術を学ぶのに時間がかかる場合がある。しかし、Jetpack Composeの長所を活用すれば、より効率的で柔軟なAndroidアプリ開発が可能であり、今後もJetpack Composeの進化と新しい機能に注目しながらさらに前進する予定である。