Jetpack Compose 中添加 click 事件的几种方法

这篇具有很好参考价值的文章主要介绍了Jetpack Compose 中添加 click 事件的几种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Compose 中添加 click 有多总方法,本文做一个简单总结

1. Modifier.clickable

这是最常见也是最简单的方式,如下所示

Box(
    modifier = Modifier.clickable {
        // 处理点击事件
    }
)

当点击发生时,除了可以相应事假处理,也会触发水波纹(Ripple)等主题效果。

需要注意,对于 Button 类的 Composable ,不推荐使用 Modifier.clickable,应该使用其自带的 onClick 参数,虽然其内部在调用 Modifier.clickable 之外还有一些额外处理

Button (
	onClick = {
	 	// 处理点击事件
	}) {
	//...
}

2. Modifier.combinedClickable

在单击事件之外,同时可以处理双击,长按等点击事件

Box(
    modifier = Modifier
        .combinedClickable(
            onClick = {
                // 单击
            },
            onDoubleClick = {
                // 双击
            },
            onLongClick = {
                // 长按
            }
        )
)

与 Modifier.clickable 一样, 点击会触发水波纹效果。

3. Modifier.pointerInput

pointerInput 是 Compose 中处理所有手势事件的入口,类似传统视图的 onTouch 。在这里可以识别 click 手势,而且相应优先级高于 clickable,但是不会触发水波纹之类的效果

Box(
    modifier = Modifier
        .pointerInput(Unit) {
            detectTapGestures(
                onDoubleTap = {
                },
                onLongPress = {
                },
                onPress = {
                },
                onTap = {
                }
            )
        },
)

如上,detectTapGestures 内可以处理点击各种事件。类似的还有 detectDragGestures 可以处理拖动事件。

detectTapGestures 中除了相应事件,还能通过 offset 获知当前点击位置,如下:

detectTapGestures(
    onTap = {
        val x = it.x
        val y = it.y
    },
)

此外,当发生 onPress 事件时,还可以获取手指离开时的回调

var pressing by remember { mutableStateOf(false) }

Box(
    modifier = Modifier
        .pointerInput(Unit) {
            detectTapGestures(
                onPress = {
                    // 按下
                    pressing = true

                    val isCanceled = tryAwaitRelease()
                    // 离开

                    pressing = false
                },
            )
        },
)

OnPress 期间,调用 tryAwaitRelease 会挂起当前函数,当手指离开时,继续执行。

tryAwaitRelease 返回一个 bool 值:true 表示手指在当前区域内抬起,false 表示手指移出了当前区域。类似于传统视图的 UP 和 CANCEL 事件。

可见,pointerInput 对事件可以更精细的管理。

4. ViewConfiguration

如果想对事件进一步精细化控制,比如设置点击最小间隔长按超时等,可以使用 ViewConfiguration 进行配置,目前可以设置的项目如下:
Jetpack Compose 中添加 click 事件的几种方法,Jetpack Compose,android,compose,jetpack,pointerInput,clickable
可见,ViewConfiguration 的配置主要影响 combinedClickable 和 pointerInput。

通过 LocalViewConfiguration 可以获得全局默认的 ViewConfiguration。我们可以通过继承和重写的方式,在默认配置基础上实现自定义的 ViewConfiguration 。然后同样借助 CompositionLocal 实现其内部局部 UI 的自定义配置。

下面的例子展示如何自定义长按超时时间:

// 自定义 ViewConfiguration
class CustomViewConfiguration(
    private val defaultViewConfiguration: ViewConfiguration //传入默认配置
) : ViewConfiguration by defaultViewConfiguration {

    // 自定义长按超时3000ms
    override val longPressTimeoutMillis: Long = 3000
}

@Composable
fun Sample() {
    // 获取全局默认 ViewConfiguration
    val defaultViewConfiguration = LocalViewConfiguration.current

	// 基于默认配置创建自定义 CustomViewConfiguration
    val viewConfiguration = remember {
        CustomViewConfiguration(defaultViewConfiguration)
    }

    CompositionLocalProvider(
        LocalViewConfiguration provides viewConfiguration
    ) {
        // 内部的事件配置都受到 CustomViewConfiguration 影响
        Box(
            modifier = Modifier
                .combinedClickable(
                    onLongClick = {
                        // ...
                    },
                )
        )
    }
}

值得一提的是 ViewConfiguration.minimumTouchTargetSize 用来设置手势可响应区域的最小尺寸。这个挺实用,可以解决界面上一些小尺寸控件比艰难点触的问题。 因此,通过设置,有可能 Composable 中 pointerInput 可以相应事件的区域大于其实际渲染的区域。此时取得的 offset 值可能是负数,亦可能超过 Compose 的 size。

minimumTouchTargetSize 默认值是 48.dp,所以如果我们开发中获取了负数 offset 值也不惊奇。

class CustomViewConfiguration(
    private val defaultViewConfiguration: ViewConfiguration
) : ViewConfiguration by defaultViewConfiguration {

    override val minimumTouchTargetSize: DpSize = DpSize(0.dp, 0.dp)
}

可以做个实验,如果将其设置为 0.dp,则永远不会获得负数的 offset 。当然我们不推荐这么做,会造成难点触的情况出现。文章来源地址https://www.toymoban.com/news/detail-542184.html

到了这里,关于Jetpack Compose 中添加 click 事件的几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android设置控件阴影的几种方法

    第一种方式: elevation View的大小位置都是通过x,y确定的,而现在有了z轴的概念,而这个z值就是View的高度(elevation),而高度决定了阴影(shadow)的大小。 View Elevation(视图高度) View的z值由两部分组成,elevation和translationZ(它们都是Android L新引入的属性)。 eleavation是静态

    2024年02月14日
    浏览(38)
  • 【Android】之【延时执行的几种方法】

    在Android日常开发中我们经常会有延时执行某个操作的需求,例如我们启动应用的时候,开始呈现一个引导页面,过了两三秒后,自动跳转到主界面;又如为了控制时序,需要延时执行等等。 下面整理下实现延时执行操作的几种方法: 推荐使用这种方式 适合需要一直在后台运

    2024年02月11日
    浏览(40)
  • 如何使Android按钮控件位于底部的几种方法

    如何使Android按钮控件位于底部的几种方法 在Android应用程序开发中,经常会遇到需要将按钮控件放置在屏幕底部的情况。这样可以提升用户体验,并且使界面更加直观。本文将介绍几种实现这一目标的方法,并提供相应的源代码。 方法一:使用RelativeLayout布局 RelativeLayout布局

    2024年01月16日
    浏览(42)
  • Android开发:RecyclerView获取item位置的几种方法比较

            当使用 RecyclerView 来展示列表数据时,获取 item 的位置是一个常见的需求。RecyclerView 提供了多种获取 item 位置的方法,包括 getAdapterPosition() 、 getBindingAdapterPosition() 、 getAbsoluteAdapterPosition() 等等。这些方法的实现原理和返回值有所不同,因此在实际使用时需要根据

    2023年04月20日
    浏览(83)
  • Vue对Element中的el-tab-pane添加@click事件无效

    发现问题 使用element-UI中的el-tabs的时候 想给每一个tab绑定事件,并传递id值,但是这样子绑定点击tab时click事件无效。 查看官方文档发现,官方文档只提供了关于tab的点击事件,而tab-pane没有点击事情。 解决方法 在el-tab-pane中加入插槽,tab的名称为插槽的内容,此时点击每个

    2024年02月16日
    浏览(49)
  • Android Jetpack Compose 别裁

    一、简介 二、compose优缺点 三、compose好学吗 四、Android Jetpack Compose 跟 fluter 哪个更好 五、Android Jetpack Compose 跟 fluter 技能学习选择 之所以叫Android Jetpack Compose别裁是希望能取舍网上的对compose的资料,推出别出心裁的文章,文章结束都会有一个案例,通过实践学习,让学习的

    2024年02月03日
    浏览(66)
  • Jetpack Compose: Hello Android

    Jetpack Compose 是一个现代化的工具包,用于使用声明式方法构建原生 Android UI。在本博文中,我们将深入了解一个基本的 “Hello Android” 示例,以帮助您开始使用 Jetpack Compose。我们将探讨所提供代码片段中使用的函数和注解。 在深入代码之前,请确保您已经准备好使用 Jetpac

    2024年03月10日
    浏览(60)
  • Android Jetpack Compose — Slider滑动条

            在Android Jetpack Compose中,Slider(滑动条)是一个常用的用户界面控件,它允许通过滑动条来选择一个范围或数值。Slider控件非常适用于调整音量、亮度、进度等需要连续调整的场景。 一、Slider的属性         Slider是Android Jetpack Compose中的一个控件,用于实现滑动条

    2024年02月11日
    浏览(52)
  • 探索Android Jetpack Compose的Surface组件

    随着声明性 UI 框架 Jetpack Compose 的出现,Android 开发变得更加简洁和直观。在这篇博客中,我们将深入探讨其中的一项基本构建块 —— Surface 组件,了解它如何影响 UI 的显示和设计。 一、Jetpack Compose和Surface组件 二、Surface组件的基本使用 三、影响Surface的属性 一、Jetpack Co

    2024年02月11日
    浏览(58)
  • Android Jetpack Compose之RadioGroup的使用

    Android Jetpack Compose是一个现代化的UI工具包,帮助开发者以声明式的方式构建出美观且功能强大的Android应用。在本文中,我们将详细介绍其中的一个重要组件—— RadioGroup 。 一. RadioGroup简介 Jetpack Compose中并没有像传统View系统中那样直接提供 RadioGroup ,但我们可以很方便地通

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包