我有一个垂直的Column
,它有两个孩子:
1.一个Pager
组合(来自Accompanist),它显示Text
。
1.一个Canvas
组合工具,可以绘制两个弧和一个圆。
它们的顺序与这里描述的相同。我希望Text
总是在Canvas
之后渲染。
实现详情
Canvas
组合有一个Modifier.pointerInteropFilter
,它处理MotionEvent.ACTION_DOWN
和MotionEvent.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
}
}
作为参考,我的布局产生以下内容:
1条答案
按热度按时间enxuqcxy1#
使用Jetpack Compose 1.4.1和来自
androidx.compose.foundation.pager.HorizontalPager
的HorizontalPager而不是伴奏者,这不再是一个问题。