0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

単純な棒グラフをJetpackComposeでつくる

Posted at

はじめに

今回はすごくシンプルな棒グラフをJetpackComposeで作っていこうと思います

本文

今回は左と下部にのみ基準線がありますが、各RowやColumnのところにBoxで線を追加してあげることで囲むことも可能です

@Composable
fun BarChart(
    data: Map<String, Float>,
    maxValue: Int,
    isShowHalf: Boolean
) {
    val gray = HogeTheme.colors.Gray
    val textMeasurer = rememberTextMeasurer()
    val measurerStyle =
        HogeTheme.typography.fontSize12.copy(color = HogeTheme.colors.Gray)
    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(start = 16.dp, end = 16.dp, bottom = 28.dp),
        verticalArrangement = Arrangement.Top
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .height(200.dp)
                .drawBehind {
                    val max =
                        textMeasurer.measure(
                            AnnotatedString(maxValue.toString()),
                            style = measurerStyle
                        )
                    drawLine(
                        color = gray200,
                        start = Offset(0f, 0f),
                        end = Offset(size.width - 64, 0f),
                        strokeWidth = 1.dp.toPx(),
                        cap = StrokeCap.Square
                    )
                    drawText(
                        max,
                        topLeft = Offset(size.width - 60, -24f)
                    )
                    if (isShowHalf) {
                        drawLine(
                            color = gray200,
                            start = Offset(0f, size.height / 2),
                            end = Offset(size.width - 64, size.height / 2),
                            strokeWidth = 1.dp.toPx(),
                            cap = StrokeCap.Square
                        )
                        val half = textMeasurer.measure(
                            AnnotatedString((maxValue / 2).toString()),
                            style = measurerStyle
                        )
                        drawText(
                            half,
                            topLeft = Offset(size.width - 60, size.height / 2 - 24)
                        )
                    }
                    val zero = textMeasurer.measure(
                        AnnotatedString("0"),
                        style = measurerStyle
                    )
                    drawText(
                        zero,
                        topLeft = Offset(size.width - 60, size.height - 24)
                    )
                },
            verticalAlignment = Alignment.Bottom,
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            // graph
            data.forEach {
                Box(
                    modifier = Modifier
                        .clip(RoundedCornerShape(topStart = 4.dp, topEnd = 4.dp))
                        .fillMaxHeight(it.value)
                        .background(HogeTheme.colors.red)
                        .weight(0.5f)
                )
                Spacer(modifier = Modifier.weight(0.5f))
            }
        }

        // X-Axis Line
        Box(
            modifier = Modifier
                .fillMaxWidth()
                .padding(end = 24.dp)
                .height(1.dp)
                .background(HogeTheme.colors.gray)
        )

        // Scale X-Axis
        Row(
            modifier = Modifier
                .fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            data.keys.forEach {
                Text(
                    modifier = Modifier.weight(0.5f),
                    text = it,
                    style = HogeTheme.typography.fontSize12.copy(color = HogeTheme.colors.gray),
                    textAlign = TextAlign.Center
                )
                Spacer(modifier = Modifier.weight(0.5f))
            }
        }
    }
}

最後に

今回は自分が仕事上で実装した簡易的なグラフを備忘録程度に記事に残してみました
どなたかのお役に立てれば幸いです

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?