带有 Android View 的 Lazy Column 在滚动时滞后很多

问题描述 投票:0回答:1

我有一个带有项目的惰性列,其中每个项目都有自己的自定义滑块,它是使用 AndroidView() 实现的。问题是滑块的 onDraw() 方法被覆盖了。由于 onDraw() 方法在主线程中运行,在重新组合或滚动期间,UI 开始出现很多延迟。我该如何解决这个问题?

LazyColumn(
                modifier = Modifier.fillMaxWidth(), contentPadding = it
            ) {
                itemsIndexed(items = historyState.asReversed())
              { index, history ->
                   HistoryItem(
                        name = history.groupName,
                        progress= history.progress)
              }
              }



 @Composable
    fun HistoryItem(name: String,progress:Float)
    {
Column{
    Text(text = name)

    WaveFormCompose(
    modifier = Modifier
    .weight(0.7F)
    .padding(8.dp),
    progress = progress,
    audioData = someData,
    audioTrack = someByteBuffer,
    onSeekStarted = {onSeekStarted(it)},
    onSeekFinished = {},
    )
}
}

组合函数 WaveFormCompose() 如下所示:

        @Composable
        fun WaveFormCompose(
            modifier: Modifier,
            progress: Float,
            audioTrack: ReplayTrack?,
            audioData: ByteBuffer?,
            onSeekStarted: (Float) -> Unit,
            onSeekFinished: (Float) -> Unit,
        ) {
            AndroidView(modifier = modifier,
                factory = { context ->
                    WaveformSlider (context).apply {
                        this.audioData = audioData
                        value = progress
    },
    update ={
    it.value =progress

})

现在 WaveFormSlider 类是一个自定义视图,它扩展了 Google material Slider,并覆盖了它的 onDraw() 方法。 内部类

class WaveformSlider @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null){
    Slider(context, attrs)

    override fun onDraw(canvas: Canvas) {
            if (heights == null) {
                computeHeights()
            }
    
            // Draw waveform
            for (i in 0 until (heights?.size ?: 0)) {
                val height = heights?.get(i) ?: 0.0f
                if (height > 0) {
                    drawWaveformLine(canvas, i, height)
                }
            }
    
            super.onDraw(canvas)
        } 
}
android android-jetpack-compose android-view android-canvas
1个回答
0
投票

反转操作是重操作,应按如下方式进行:

val reversedList = remember(historyState) {  historyState.asReversed() }

请检查并通知我

© www.soinside.com 2019 - 2024. All rights reserved.