Christopher Elías
06/10/2021, 8:49 PMUnsupportedException
, does anybody has trying to do the same and actually succeed?
@Composable
fun LinearTransactionsChart(
modifier: Modifier = Modifier,
transactionsPerSecond: TransactionsPerSecond,
defaultDispatcher: CoroutineDispatcher
) {
if (transactionsPerSecond.transactions.isEmpty()) return
val composableScope = rememberCoroutineScope()
Canvas(modifier = modifier) {
composableScope.launch(Dispatchers.Main) {
emitTransactions(
defaultDispatcher = defaultDispatcher,
maxTransaction = transactionsPerSecond.maxTransaction,
transactions = transactionsPerSecond.transactions,
canvasWidth = size.width,
canvasHeight = size.height
) { start, end ->
drawLine(
start = start,
end = end,
color = Color(0xFFFFFFFF)
)
}
}
}
}
// The list can have like 1K ~ 2K items...
suspend fun emitTransactions(
defaultDispatcher: CoroutineDispatcher,
maxTransaction: Double,
transactions: List<TransactionRate>,
canvasWidth: Float,
canvasHeight: Float,
dots: (start: Offset, end: Offset) -> Unit
) {
// ... Do some heavy computation for creating the start and end Offset...
withContext(defaultDispatcher) {
transactions.forEachIndexed { index, transactionRate ->
dots(Offset(x, y), Offset(x, y))
}
}
}
Nader Jawad
06/11/2021, 8:17 PMChristopher Elías
06/11/2021, 9:01 PMNader Jawad
06/11/2021, 9:58 PM@Composable
fun DrawLines(modifier: Modifier = Modifier, pt1: Offset, pt2: Offset) {
class DrawParams(val imageBitmap: ImageBitmap, val canvas: Canvas, val drawScope: CanvasDrawScope)
val drawParamsRef = remember { Ref<DrawParams>() }
Box(modifier = modifier.drawWithCache {
val canvas: Canvas
val drawScope: CanvasDrawScope
val imageBitmap: ImageBitmap
var drawParams = drawParamsRef.value
// Create offscreen bitmap if we don't have one. Note this should also be updated
// if the size changes. This bitmap is persisted across composition calls and retains
// the previously drawn lines across each composition
if (drawParams == null) {
imageBitmap = ImageBitmap(size.width.roundToInt(), size.height.roundToInt())
canvas = Canvas(imageBitmap)
drawScope = CanvasDrawScope()
drawParams = DrawParams(imageBitmap, canvas, drawScope)
drawParamsRef.value = drawParams
}
drawParams.drawScope.draw(this, layoutDirection, drawParams.canvas, size) {
drawLine(color = Color.Blue, start = pt1, end = pt2)
}
onDrawBehind {
// After the bitmap is updated, draw the bitmap once here
drawImage(drawParams.imageBitmap)
}
})
}
@Composable
fun RandomLinesDemo() {
var pt1 by remember{ mutableStateOf(Offset.Zero) }
var pt2 by remember{ mutableStateOf(Offset.Zero) }
val size = 300
val density = LocalDensity.current
val sizeDp = with(density) {
size.toDp()
}
val random = Random.Default
DrawLines(modifier = Modifier.size(sizeDp).clickable {
pt1 = Offset(random.nextInt(0, size).toFloat(), random.nextInt(0, size).toFloat())
pt2 = Offset(random.nextInt(0, size).toFloat(), random.nextInt(0, size).toFloat())
}, pt1, pt2)
}
Nader Jawad
06/11/2021, 10:00 PMChristopher Elías
06/15/2021, 1:11 AM