Compose_Modifier 修饰符的常见使用

1.尺寸

Modifier
	.fillMaxSize() // 撑满
	.fillMaxWidth()	// 宽度撑满
	.fillMaxHeight() // 高度撑满
	.fillMaxWidth(0.5) // 宽度为最大宽度的比例
	.fillMaxHeight(0.5) // 高度为最大高度的比例
	.wrapContentSize() // 自适应尺寸
	.wrapContentWidth() // 自适应宽度
	.wrapContentHeight() // 自适应高度
	.size(width = 20.dp, height = 20.dp) // 固定尺寸
	.width(160.dp) // 固定宽
	.height(160.dp) // 固定高
	.sizeIn( // 限制尺寸范围
		minWidth = 100,
		maxWidth = 200,
		minHeight = 100,
		maxHeight = 200,
	)
	// 强制尺寸,哪怕超出父视图尺寸
	.requiredSize(100.dp, 100.dp)
	.requiredHeight(10.dp)
	.requiredWidth(10.dp)
	.requiredSizeIn( // 限制尺寸范围
		minWidth = 100,
		maxWidth = 200,
		minHeight = 100,
		maxHeight = 200,
	)
	.scale(0.5f) // 缩放比例
	.onSizeChanged( it: IntSize
		// 首次测量元素时或元素的大小发生变化时的回调
	)

1.1.weight

weight 权重,例如:Row里有两个box,分别如下:

Row(modifier = Modifier.width(150.dp)) {
	Image(modifier = Modifier.weight(1f))
	Text(modifier = Modifier.weight(2f))
}

则 Image 的宽度为 50, Text 的宽度为 100。

1.2.padding

Modifier
	.padding(10.dp)
	.padding(start = 2.dp, top = 2.dp, end = 2.dp, end = 2.dp)

padding 跟 size 先后顺序:

Modifier
	.padding(10.dp) // 外边距
	.size(100.dp)
	.padding(10.dp) // 内边距

padding 跟 backgroundColor 先后顺序:

Modifier
	.background(color = Color.Red) // 整个视图的背景色 
	.padding(10.dp)
	.background(color = Color.Blue) // 减掉内边距后填充的背景色

Modifier 的点语法可以看做是一层一层叠加的效果,每个点语法都是在当前的状态下进行加工,将加工后的结果传递给下一个点语法。


2.位置

Modifier
	.offset(x = 2.dp, y = 2.dp) // x轴和y轴的偏移量
	.absoluteOffset(x,y) // 绝对偏移,不考虑布局方向

3.样式

Modifier
	.alpha(0.5f) // 不透明度
	.clip(shape = RoundedCornerShape(8.dp))	// 圆角
	.clipToBounds() // 裁剪超出内容
	.border(width = 2.dp, color = Color.Red, shap = RoundedCornerShape(8.dp)) // 边框
	.shadow() // 阴影
	.rotate(90f) // 旋转角度,中心为锚点

4.背景色

.background(color = Color.White, shape = RoundedCornerShape(8.dp)) // 背景色带圆角
.background(
	Brush.verticalGradient( // 渐变背景色
		listOf(
				Color.Black.copy(alpha = 0.8f),
				Color.Black.copy(alpha = 0.32f),
				Color.Black.copy(alpha = 0f),
				)
		)
	)
)

5.点击

.clickable { // 默认带点击效果
	enabled = true,
	onClick = { /* todo */}
}
// 去掉点击效果
.clickable(onClick = {
	// ...
}, indication = null, interactionSource = remember {
	MutableInteractionSource()
})

6.滚动

.horizontalScroll( // 横向滚动
	state = rememberScrollState(),
	enabled = true
)
.verticalScroll( // 竖向滚动
	state = rememberScrollState(),
	enabled = true
)
.scrollable(
	state = rememberScrollState(),
	orientation = Orientation.Horizontal,
)

7.then

根据条件添加设置

Modifier
	.then (
		if (on) 
			Modifier.background(color = Color.Red)
		else 
			Modifier
	)

参考:
modifiers-list

<think>好的,用户想了解Jetpack Compose中的pointerInput修饰符的用法和示例。首先,我需要回忆一下pointerInput的基本作用。它主要用于处理触摸事件和手势识别,比如点击、长按、拖动等。用户可能需要具体的代码示例和不同场景的应用方法。 接下来,我应该检查之前的引用内容是否有相关的信息。查看用户提供的引用,引用[1]到[4]主要涉及Compose的基础组件、文本处理和布局,但没有直接提到pointerInput。因此,我需要依靠自己的知识库来组织回答。 用户可能需要分步骤的说明,所以应该将内容结构化。例如,先解释pointerInput的作用,然后分点介绍常见用法,如单击、双击、拖动等,并给出代码示例。同时,需要注意代码的正确性,比如使用remember和LaunchedEffect来管理状态和副作用。 另外,用户可能对高级用法感兴趣,比如组合手势或自定义手势识别。需要确保示例清晰,并解释每个参数的作用,比如detectTapGestures中的onPress、onDoubleTap等回调。 最后,生成相关问题时,要考虑用户可能进一步的需求,比如性能优化、与其他手势的冲突解决、自定义手势的实现,以及实际应用场景。这些问题可以帮助用户深入学习和解决问题。 需要确保回答符合系统级指令,使用正确的中文和LaTeX格式,虽然这个问题可能不涉及数学公式,但如果有变量或代码内的数学表达式,要正确使用$符号。不过在这个问题中,主要是代码块和文字说明,所以重点放在代码的格式上,使用三个反引号包裹代码示例,并注明语言类型。 检查是否有遗漏的重要点,比如pointerInput的key参数的作用,当key变化时如何重新启动手势检测,以及如何处理多个手势的交互。确保每个示例都有解释,帮助用户理解代码的逻辑和应用场景。 总结回答结构:先概述pointerInput的作用,然后分点介绍不同用法,每个用法配示例代码和说明,最后生成相关问题。确保引用标识正确添加,但根据用户提供的引用,可能没有直接相关的,所以需要确认是否引用合适的内容。这里用户提供的引用可能不相关,所以可能不需要添加引用标识,除非有间接关联。</think>### Jetpack Compose 中 `pointerInput` 修饰符详解 `pointerInput` 是 Jetpack Compose 中用于处理触摸事件和手势的核心修饰符,它允许开发者通过声明式 API 实现复杂的交互逻辑。以下是其核心用法和示例: --- #### 1. **基础用法:监听点击事件** 通过 `detectTapGestures` 可监听单击、长按等事件: ```kotlin @Composable fun ClickDemo() { val context = LocalContext.current Box( modifier = Modifier .size(100.dp) .background(Color.Blue) .pointerInput(Unit) { detectTapGestures( onPress = { /* 按下时触发 */ }, onTap = { Toast.makeText(context, "单击", Toast.LENGTH_SHORT).show() }, onDoubleTap = { Toast.makeText(context, "双击", Toast.LENGTH_SHORT).show() }, onLongPress = { Toast.makeText(context, "长按", Toast.LENGTH_SHORT).show() } ) } ) } ``` --- #### 2. **拖动交互** 使用 `detectDragGestures` 实现拖动效果,结合 `offset` 修饰符更新位置: ```kotlin @Composable fun DraggableBox() { var offset by remember { mutableStateOf(Offset.Zero) } Box( modifier = Modifier .offset { IntOffset(offset.x.toInt(), offset.y.toInt()) } .size(100.dp) .background(Color.Red) .pointerInput(Unit) { detectDragGestures { change, dragAmount -> offset += dragAmount change.consume() } } ) } ``` --- #### 3. **自定义手势识别** 通过 `awaitPointerEventScope` 实现低级别事件处理,例如两点触控缩放: ```kotlin @Composable fun PinchZoomDemo() { var scale by remember { mutableStateOf(1f) } Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitEachGesture { val event = awaitPointerEvent() if (event.changes.size >= 2) { val distance = event.calculateZoom() scale *= distance } } } .graphicsLayer { scaleX = scale; scaleY = scale } .background(Color.Green) ) } ``` --- #### 4. **条件触发与状态管理** `pointerInput` 的 `key` 参数可控制手势检测的重启条件: ```kotlin // 当 enabled 变化时,重新绑定手势检测 .pointerInput(enabled) { if (enabled) { detectTapGestures { /* ... */ } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小莫同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值