I am following the document of Intrinsics. I want to wrap the canvas view. I want to use canvas into multiple times because I want to make timeline view. So drawing in the canvas is everything works fine.
@OptIn(ExperimentalTextApi::class)
@Preview(showBackground = true)
@Composable
fun CanvasView() {
val titleTextMeasurer = rememberTextMeasurer()
val titleText = "Hello world!!"
val listOfPair = listOf(
Pair("Text 1", "app"),
Pair("Text 2", "link"),
Pair("Text 3", "app"),
Pair("Text 4", "link"),
Pair("Text 5", ""),
)
val multipleString = buildAnnotatedString {
listOfPair.forEachIndexed { _, item ->
val (text, type) = item
when (type) {
"app" -> {
withStyle(style = SpanStyle(color = Color.DarkGray)) {
append("$text\n")
}
}
"link" -> {
withStyle(style = SpanStyle(color = Color.Blue)) {
append("$text\n")
}
}
else -> {
append("$text\n")
}
}
}
}
val titleTextLayoutResult = remember {
titleTextMeasurer.measure(titleText, TextStyle(fontSize = 16.sp))
}
val multipleTextLayoutResult = remember {
titleTextMeasurer.measure(multipleString, TextStyle(fontSize = 14.sp, lineHeight = 1.3.em))
}
val endPadding = with(LocalDensity.current) { 10.dp.toPx() }
val circleSize = with(LocalDensity.current) { 6.dp.toPx() }
CanvasContent(
titleTextLayoutResult,
multipleTextLayoutResult,
circleSize,
endPadding,
)
}
@OptIn(ExperimentalTextApi::class)
@Composable
fun CanvasContent(
titleTextLayoutResult: TextLayoutResult,
multipleTextLayoutResult: TextLayoutResult,
circleSize: Float,
endPadding: Float,
) {
Canvas(modifier = Modifier.fillMaxSize()) {
val circleX = (center.x / 2) + (titleTextLayoutResult.size.width / 2) - endPadding
drawText(
textLayoutResult = titleTextLayoutResult,
topLeft = Offset(
x = center.x - titleTextLayoutResult.size.width / 2,
y = center.y - titleTextLayoutResult.size.height / 2,
)
)
drawText(
textLayoutResult = multipleTextLayoutResult,
topLeft = Offset(
x = center.x - titleTextLayoutResult.size.width / 2,
y = center.y + titleTextLayoutResult.size.height / 2,
)
)
drawLine(
color = Color.Black,
start = Offset(x = circleX, y = 0F),
end = Offset(x = circleX, y = center.y - circleSize),
strokeWidth = 2.dp.toPx(),
)
drawLine(
color = Color.Black,
start = Offset(x = circleX, y = center.y + circleSize),
end = Offset(x = circleX, y = size.height),
strokeWidth = 2.dp.toPx(),
)
drawCircle(
color = Color.Gray,
radius = circleSize,
center = Offset(circleX, center.y)
)
}
}
The view looks full screen like this
Now I want to use this view in multiple times. I tried the parent item to height(IntrinsicSize.Min)
and inside Canvas(modifier = Modifier.fillMaxSize())
it not warping the view i.e. view is not visible any more. Code looks like this
Column(
Modifier
.fillMaxWidth()
.height(IntrinsicSize.Min)
) {
CanvasContent(
titleTextLayoutResult,
multipleTextLayoutResult,
circleSize,
endPadding,
)
}
So view is not visible any more. So what is the wrong in here?
My main goal is to create the view like below image.
Thanks