Leistungsprobleme in Jetpack komponieren Lazyrow mit mehr als 10.000 Elementen und häufigen Frequenzänderungen (Audio -W

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Leistungsprobleme in Jetpack komponieren Lazyrow mit mehr als 10.000 Elementen und häufigen Frequenzänderungen (Audio -W

by Anonymous » Today, 03:03

Ich stoße auf ein Leistungsproblem, während ich versuche, eine Audio -Wellenform in Jetpack Compose zu rendern. Ich verwende einen Lazyrow, um eine Wellenform mit mehr als 10.000 Elementen anzuzeigen, wobei jedes Element einem Frequenzwert entspricht, der häufig aktualisiert. Ich verwende den DrawBehind -Modifikator, um die Wellenform zu rendern, aber es scheint, dass das Zeichnen aller Elemente jedes Mal, wenn die Frequenzänderungen nicht effizient genug sind. Zeichnen Sie die Wellenform für jeden Frequenzwert rendern.

Code: Select all

@Composable
fun AudioFrequencyUI(
frequenciesList: List,
waveWidth: Dp = 4.dp,
waveHeight: Dp = 80.dp,
upperStrokeWidth: Float = 8f,
lowerStrokeWidth: Float = 6f,
upperWaveColor: Color = Color.Yellow,
lowerWaveColor: Color = Color.Yellow,
gapSize: Dp = 4.dp,
minMagnitude: Float = 10f,
contentPadding: PaddingValues = PaddingValues(0.dp),
modifier: Modifier = Modifier
) {
val frequencies = remember { mutableStateListOf() }

val listState = rememberLazyListState()

LaunchedEffect(frequencies.size) {
if (frequencies.isNotEmpty()) {
listState.scrollToItem(frequencies.size - 1)
}
}

LaunchedEffect(frequenciesList) {
frequencies.clear()
frequencies.addAll(frequenciesList)
delay(1000)
}

LazyRow(
state = listState,
horizontalArrangement = Arrangement.spacedBy(gapSize),
modifier = modifier
.wrapContentWidth()
.height(waveHeight),
contentPadding = contentPadding
) {
itemsIndexed(frequencies, key = { index, _ -> index }) { index, magnitude ->
Box(
modifier = Modifier
.width(waveWidth)
.height(waveHeight)
) {
val maxMagnitude = frequencies.maxOrNull() ?: 1

Spacer(modifier = Modifier
.fillMaxSize()
.drawBehind {
var scaledMagnitude = magnitude / maxMagnitude.toFloat() * size.height / 2
scaledMagnitude = scaledMagnitude.coerceAtLeast(minMagnitude)

val halfHeight = size.height / 2

drawLine(
color = upperWaveColor,
start = Offset(size.width / 2, halfHeight),
end = Offset(size.width / 2, halfHeight - scaledMagnitude),
strokeWidth = upperStrokeWidth
)

drawLine(
color = lowerWaveColor,
start = Offset(size.width / 2, halfHeight),
end = Offset(size.width / 2, halfHeight + scaledMagnitude),
strokeWidth = lowerStrokeWidth
)
})
}
}
}
}


Top