android 停止Jetpack Compose pointerInteropFilter使用输入事件

7tofc5zh  于 2023-04-18  发布在  Android
关注(0)|答案(1)|浏览(177)

我有一个垂直的Column,它有两个孩子:
1.一个Pager组合(来自Accompanist),它显示Text
1.一个Canvas组合工具,可以绘制两个弧和一个圆。
它们的顺序与这里描述的相同。我希望Text总是在Canvas之后渲染。

实现详情

Canvas组合有一个Modifier.pointerInteropFilter,它处理MotionEvent.ACTION_DOWNMotionEvent.ACTION_MOVE。如果事件不在弧的10%距离内,则忽略它,并返回false
我的理解是返回false将表明事件尚未被消费,因此将被传递给Pager来处理-但事实并非如此。一旦Modifier.pointerInteropFilter被注册,Pager就永远不会接收输入事件,无论返回true还是false

布局

为了简洁起见,下面是我当前实现的简化版本。我有一个Column,它首先渲染Pager,然后渲染Canvas

Column(
    modifier = Modifier.fillMaxSize(),
    verticalArrangement = Arrangement.Center
) {
    // The Pager should always be rendered behind the Canvas. This is to
    // prevent the Text from rending on top when being dragged.
    HorizontalPager(
        state = rememberPagerState(pageCount = 8000, initialPage = 4000)
    ) { page ->
        Text(
            modifier = Modifier.fillMaxWidth(),
            text = "25:00",
            textAlign = TextAlign.Center,
            fontSize = 60.sp
        )
    }
}

var progress by remember { mutableStateOf(0.25f) }

ArcSeekBar(progress, false) { change ->
    progress = change
}

在这个例子中,我对pointerInteropFilter进行了硬编码,使其总是返回false,假设它不会消耗/阻止事件,允许它传递到Pager

@Composable
fun ArcSeekBar(progress: Float, interaction: Boolean, changed: (Float) -> Unit) {
    val sweepAngle = 270.0f

    var width: Int by remember { mutableStateOf(0) }
    var height: Int by remember { mutableStateOf(0) }

    Canvas(
        modifier = Modifier
            .fillMaxSize()
            .aspectRatio(1.0f)
            .onSizeChanged {
                width = it.width
                height = it.height
            }
            .pointerInteropFilter {
                // Reduced for brevity, but whatever the function returns
                // the Pager composable behind it will never receive input events.
                false
            },
    ) {
        // Omitted for brevity, draw two arcs and a circle
    }
}

作为参考,我的布局产生以下内容:

enxuqcxy

enxuqcxy1#

使用Jetpack Compose 1.4.1和来自androidx.compose.foundation.pager.HorizontalPager的HorizontalPager而不是伴奏者,这不再是一个问题。

相关问题