Jetpack Compose Surface 点击波纹不根据形状裁剪?
Jetpack Compose Surface click ripple is not clipped based on shape?
我有 3 个表面,当我单击波纹效果传播时可以在 gif 中看到,而不考虑表面的形状。
哪些是用
创建的
@Composable
fun SurfaceClickPropagationExample() {
// Provides a Context that can be used by Android applications
val context = AmbientContext.current
// Offset moves a component in x and y axes which can be either positive or negative
// When a component inside surface is offset from original position it gets clipped.
Box(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.clipToBounds()
.clickable(onClick = {})
) {
Surface(
modifier = Modifier
.preferredSize(150.dp)
.padding(12.dp)
.clickable(onClick = {
})
.clipToBounds(),
elevation = 10.dp,
shape = RoundedCornerShape(10.dp),
color = (Color(0xFFFDD835))
) {
Surface(
modifier = Modifier
.preferredSize(80.dp)
.clipToBounds()
.offset(x = 50.dp, y = (-20).dp)
.clickable(onClick = {
}),
elevation = 12.dp,
shape = CircleShape,
color = (Color(0xFF26C6DA))
) {
}
}
Surface(
modifier = Modifier
.preferredSize(110.dp)
.padding(12.dp)
.offset(x = 110.dp, y = 20.dp)
.clickable(onClick = {}),
shape = CutCornerShape(10.dp),
color = (Color(0xFFF4511E)),
elevation = 8.dp
) {}
}
}
我添加了 Modifier.clipToBounds()
以检查它是否适用于它,但不管有没有它都不起作用。
compose 版本 1.0.0-beta08 更新:
使用接受 onClick 的 Surface 的新实验性重载。
@ExperimentalMaterialApi
@Composable
fun Surface(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colors.surface,
contentColor: Color = contentColorFor(color),
border: BorderStroke? = null,
elevation: Dp = 0.dp,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
indication: Indication? = LocalIndication.current,
enabled: Boolean = true,
onClickLabel: String? = null,
role: Role? = null,
content: () -> Unit
): @ExperimentalMaterialApi @Composable Unit
尝试在 Modifier.clickable
之前应用 Modifier.clip(shape: Shape)
。
在撰写中使用修饰符时,顺序很重要。首先出现的修饰符元素将首先应用。 (documentation)
当 Surface
和 Card
布局与 onClick
参数都是实验性的时,我正在写这个答案。
如果您不想使用实验性组件,可以尝试将您的视图包装在 Button
组件中,如下所示:
Button(
onClick = { /* TODO to handle */ },
shape = /* your shape */,
colors = ButtonDefaults.buttonColors(backgroundColor = /* your color */),
elevation = elevation(defaultElevation = 0.dp, pressedElevation = 0.dp)
) {
/* Here you can paste your parent layout like Box, Column, or Row,
but set max size and horizontal alignment to override the default button's center horizontal alignment */
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.Start
) {
// other stuff there
}
}
结果如下:
我有 3 个表面,当我单击波纹效果传播时可以在 gif 中看到,而不考虑表面的形状。
哪些是用
创建的@Composable
fun SurfaceClickPropagationExample() {
// Provides a Context that can be used by Android applications
val context = AmbientContext.current
// Offset moves a component in x and y axes which can be either positive or negative
// When a component inside surface is offset from original position it gets clipped.
Box(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.clipToBounds()
.clickable(onClick = {})
) {
Surface(
modifier = Modifier
.preferredSize(150.dp)
.padding(12.dp)
.clickable(onClick = {
})
.clipToBounds(),
elevation = 10.dp,
shape = RoundedCornerShape(10.dp),
color = (Color(0xFFFDD835))
) {
Surface(
modifier = Modifier
.preferredSize(80.dp)
.clipToBounds()
.offset(x = 50.dp, y = (-20).dp)
.clickable(onClick = {
}),
elevation = 12.dp,
shape = CircleShape,
color = (Color(0xFF26C6DA))
) {
}
}
Surface(
modifier = Modifier
.preferredSize(110.dp)
.padding(12.dp)
.offset(x = 110.dp, y = 20.dp)
.clickable(onClick = {}),
shape = CutCornerShape(10.dp),
color = (Color(0xFFF4511E)),
elevation = 8.dp
) {}
}
}
我添加了 Modifier.clipToBounds()
以检查它是否适用于它,但不管有没有它都不起作用。
compose 版本 1.0.0-beta08 更新:
使用接受 onClick 的 Surface 的新实验性重载。
@ExperimentalMaterialApi
@Composable
fun Surface(
onClick: () -> Unit,
modifier: Modifier = Modifier,
shape: Shape = RectangleShape,
color: Color = MaterialTheme.colors.surface,
contentColor: Color = contentColorFor(color),
border: BorderStroke? = null,
elevation: Dp = 0.dp,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
indication: Indication? = LocalIndication.current,
enabled: Boolean = true,
onClickLabel: String? = null,
role: Role? = null,
content: () -> Unit
): @ExperimentalMaterialApi @Composable Unit
尝试在 Modifier.clickable
之前应用 Modifier.clip(shape: Shape)
。
在撰写中使用修饰符时,顺序很重要。首先出现的修饰符元素将首先应用。 (documentation)
当 Surface
和 Card
布局与 onClick
参数都是实验性的时,我正在写这个答案。
如果您不想使用实验性组件,可以尝试将您的视图包装在 Button
组件中,如下所示:
Button(
onClick = { /* TODO to handle */ },
shape = /* your shape */,
colors = ButtonDefaults.buttonColors(backgroundColor = /* your color */),
elevation = elevation(defaultElevation = 0.dp, pressedElevation = 0.dp)
) {
/* Here you can paste your parent layout like Box, Column, or Row,
but set max size and horizontal alignment to override the default button's center horizontal alignment */
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.Start
) {
// other stuff there
}
}
结果如下: