LoginSignup
7
3

More than 1 year has passed since last update.

Jetpack Compose Modifier(修飾)

Last updated at Posted at 2022-01-20

目次

  1. Modifierとは
  2. サンプルコード
  3. まとめ

1. Modifierとは

Modifier‥コンポーザブルを修飾する、もしくは拡張するときに利用する。
このクラス関数を連鎖させてコンポーズを作成することが可能です。

では、実際にどのようなことができるかを確認してみましょう。

1. コンポーザブルのレイアウト、動作を変更できる
2. UIの要素をクリック可能、スクロール可能、ドラッグ可能にできる

では、実際にサンプルコードを通して確認してみましょう。

2. サンプルコード

Background Color

Box(
        contentAlignment = Alignment.Center
    ) {

        Text(
            text = "Modifier Example",
            modifier = Modifier
                .background(Color.Red)
        )
}

1.jpg

Padding

Box(
        contentAlignment = Alignment.Center
    ) {

        // Padding
        Text(
            text = "Modifier Example",
            modifier = Modifier
                .padding(10.dp)
                .background(Color.Red)
                .padding(10.dp)
                .background(Color.Green)
        )
}

3.jpg

Height and Width

Box(
        contentAlignment = Alignment.Center
    ) {

        //Height and Width
        Text(
            text = "Modifier Example",
            modifier = Modifier
                .background(Color.Red)
                .height(150.dp)
                .width(250.dp)
        )
}

4.jpg

Size

Box(
        contentAlignment = Alignment.Center
    ) {

        //Size
        Text(
            text = "Modifier Example",
            modifier = Modifier
                .background(Color.Red)
                .size(250.dp, 150.dp)
        )
}

4.jpg

weight

Row(
        modifier = Modifier.fillMaxWidth()
    ) {
        Text(
            text = "1",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Red),
            textAlign = TextAlign.Center
        )
        Text(
            text = "2",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Green),
            textAlign = TextAlign.Center
        )
        Text(
            text = "3",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Blue),
            textAlign = TextAlign.Center
        )
}

row.jpg

Scale

//Scale
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Green),
    ) {
        Text(
            text = "Scale",
            modifier = Modifier.scale(0.9f, 0.9f)
        )
}

scale.jpg

fillMaxHeight, fillMaxWidth, fillMaxSize

//fillMaxHeight
    Column(
        modifier = Modifier.fillMaxHeight()
    ) {
        Text(
            text = "1",
            modifier = Modifier
                .weight(1f)
                .width(100.dp)
                .background(Color.Red),
            textAlign = TextAlign.Center
        )
        Text(
            text = "2",
            modifier = Modifier
                .weight(1f)
                .width(100.dp)
                .background(Color.Green),
            textAlign = TextAlign.Center
        )
        Text(
            text = "3",
            modifier = Modifier
                .weight(1f)
                .width(100.dp)
                .background(Color.Blue),
            textAlign = TextAlign.Center
        )
    }

    //fillMaxWidth
    Row(
        modifier = Modifier.fillMaxSize()
    ) {
        Text(
            text = "1",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Red),
            textAlign = TextAlign.Center
        )
        Text(
            text = "2",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Green),
            textAlign = TextAlign.Center
        )
        Text(
            text = "3",
            modifier = Modifier
                .weight(1f)
                .height(100.dp)
                .background(Color.Blue),
            textAlign = TextAlign.Center
        )
    }

    //fillMaxSize
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Green),
        contentAlignment = Alignment.Center
    ) {
        Text(text = "FillMaxSize")
    }

column.jpg
row.jpg
5.jpg

Rotate

    //Rotate
    Box(
        modifier = Modifier
            .rotate(40f)
            .size(250.dp)
            .background(Color.Green),
    )

6.jpg

Clip

    //Clip
    Box(
        modifier = Modifier
            .fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "FillMaxSize",
            modifier = Modifier
                .size(100.dp)
                .clip(RoundedCornerShape(10.dp))
                .background(Color.Green)
                .padding(10.dp)
        )
}

7.jpg

Border

    //Border
    Box(
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "FillMaxSize",
            modifier = Modifier
                .size(100.dp)
                .border(2.dp, Color.Green)
                .background(Color.Green)
                .padding(10.dp)
        )
    }

8.jpg

Clickable

    //Clickable
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Green),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "FillMaxSize",
            modifier = Modifier
                .size(100.dp)
                .background(Color.Gray)
                .clickable {

                }
                .padding(10.dp)
        )
    }

clickable.gif

Scrollable

    //Scrollable
    Column(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Green)
            .verticalScroll(rememberScrollState()),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {

        repeat(100){
            Text(
                text = "Number $it",
                modifier = Modifier.padding(10.dp)
            )
        }
    }

scrollable.gif

draggable

    //draggable
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.Green)
    ) {

        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }

        Box(
            modifier = Modifier
                .offset{ IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                .background(Color.Red)
                .size(50.dp)
                .pointerInput(Unit) {
                    detectDragGestures { change, dragAmount ->
                        change.consumeAllChanges()
                        offsetX += dragAmount.x
                        offsetY += dragAmount.y
                    }
                }
        )
    }

draggablescaleX, scaleYをステートとして管理して、pointerInputのラムダ内で検出した変更を、change.consumeAllChanges()で読み取り、ステートとして管理していたscaleX, scaleYの状態に変更を加えることで実現しています。

draggable.gif

3. まとめ

この記事で紹介したのは一例ですが、Modifierを使ったコンポーザブルの修飾をざっくりとつかむことができたと思います。

公式ドキュメントで紹介されて気になったものがあればぜひ試してみてください。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3