Pressable
Pressable 是一个核心组件包装器,可检测其所定义子元素上的各种按压交互阶段。
<Pressable onPress={onPressFunction}>
<Text>我是可按压的!</Text>
</Pressable>
工作原理
在被 Pressable 包裹的元素上:
- 触发按压时会调用
onPressIn。 - 按压手势结束时会调用
onPressOut。
在按下 onPressIn 之后,会发生以下两种情况之一:
- 该人会移开手指,触发
onPressOut,随后触发onPress。 - 如果该人保持手指按住超过 500 毫秒后才移开,则会触发
onLongPress。在移开手指时,onPressOut仍会触发。
手指并不是最精确的工具,用户很常会意外激活错误的元素,或错过激活区域。为此,Pressable 提供了一个可选的 HitRect,你可以用它来定义触摸在离包裹元素多远的位置仍可被识别。按压可以从 HitRect 内的任意位置开始。
PressRect 允许按压在保持激活并仍有资格触发“press”的情况下,移动到元素及其 HitRect 之外——可以把它想象成你正按着一个按钮时,手指慢慢向外滑开。
触摸区域绝不会超出父视图边界;如果一次触摸命中两个重叠视图,兄弟视图的 Z-index 始终优先。
你可以使用 hitSlop 设置 HitRect,并使用 pressRetentionOffset 设置 PressRect。
Pressable 使用 React Native 的 Pressability API。有关 Pressability 状态机流程及其工作方式的更多信息,请查看 Pressability 的实现。
示例
属性
android_disableSound Android
如果为 true,则在按压时不会播放 Android 系统声音。
| 类型 | 默认值 |
|---|---|
| boolean | false |
android_ripple Android
启用 Android 涟漪效果并配置其属性。
children
可以是子元素,也可以是接收一个布尔值的函数,该布尔值表示组件当前是否处于按下状态。
unstable_pressDelay
在按下后等待多长时间(毫秒)再调用 onPressIn。
| 类型 |
|---|
| number |
delayLongPress
从 onPressIn 开始到调用 onLongPress 之间的持续时间(毫秒)。
| 类型 | 默认值 |
|---|---|
| number | 500 |
disabled
是否禁用按压行为。
| 类型 | 默认值 |
|---|---|
| boolean | false |
hitSlop
设置元素外可检测到按压的附加距离。
| 类型 |
|---|
| Rect or number |
onHoverIn
在悬停激活时调用,以提供视觉反馈。
| 类型 |
|---|
({ nativeEvent: MouseEvent }) => void |
onHoverOut
在悬停取消激活时调用,以撤销视觉反馈。
| 类型 |
|---|
({ nativeEvent: MouseEvent }) => void |
onLongPress
如果 onPressIn 之后的时间超过 500 毫秒,则会调用。此时间段可通过 delayLongPress 自定义。
| 类型 |
|---|
({nativeEvent: PressEvent}) => void |
onPress
在 onPressOut 之后调用。
| 类型 |
|---|
({nativeEvent: PressEvent}) => void |
onPressIn
在触摸接触时立即调用,早于 onPressOut 和 onPress。
| 类型 |
|---|
({nativeEvent: PressEvent}) => void |
onPressMove
在按压位置移动时调用。
| 类型 |
|---|
({nativeEvent: PressEvent}) => void |
onPressOut
在触摸释放时调用。
| 类型 |
|---|
({nativeEvent: PressEvent}) => void |
pressRetentionOffset
在 onPressOut 触发之前,视图外仍被视为按压的附加距离。
| 类型 | 默认值 |
|---|---|
| Rect or number | {bottom: 30, left: 20, right: 20, top: 20} |
style
可以是视图样式,也可以是接收一个布尔值的函数,该布尔值表示组件当前是否处于按下状态,并返回视图样式。
| 类型 |
|---|
View Style or ({ pressed: boolean }) => View Style |
testOnly_pressed
仅用于文档或测试(例如快照测试)。
| 类型 | 默认值 |
|---|---|
| boolean | false |
类型定义
RippleConfig
android_ripple 属性的涟漪效果配置。
| 类型 |
|---|
| object |
属性:
| 名称 | 类型 | 必需 | 描述 |
|---|---|---|---|
| color | color | 否 | 定义涟漪效果的颜色。 |
| borderless | boolean | 否 | 定义涟漪效果是否不包含边框。 |
| radius | number | 否 | 定义涟漪效果的半径。 |
| foreground | boolean | 否 | 设置为 true 可将涟漪效果添加到视图前景,而不是背景。如果你的某个子视图本身带有背景,或者例如正在显示图片,而你不希望涟漪被它们遮挡,这会很有用。 |