繁体   English   中英

Jetpack Compose pointerInput detectTapGestures 设置onLongPress超时?

[英]Jetpack Compose pointerInput detectTapGestures Set onLongPress timeout?

要在按钮或可组合项上实现长按功能,通常的方法是使用在修改器指针输入中检测到的点击手势

该代码看起来非常简单并且有效。

Box(modifier = modifier.pointerInput(Unit) {

    detectTapGestures(
        onPress = {
            //Do something
        },
        onDoubleTap = {
           
        },
        onLongPress = {
            onLongClick()
        },
        onTap = {

        }
    )
}

但我需要的是在检测到 longpress 事件之前以毫秒为单位修改超时(如果按下框的时间为 tomeoutMillisec,则触发 longPress 事件)

pointerInput scope 具有包含 val“longPressTimeoutMillis”的“val viewConfiguration”(ViewConfiguration 是一个接口)。 但我无法重新分配这些值(不是 longPressTimeoutMillis,不是重新分配 class viewConfiguration),因为它们是 val 而不是 var

Box(modifier = modifier.pointerInput(Unit) {

    //this gives an error
    this.viewConfiguration.longPressTimeoutMillis  = 200L
    
    detectTapGestures(
        onPress = {
 
        },
        onDoubleTap = {
            
        },
        onLongPress = {
            onLongClick()
        },
        onTap = {

        }
    )
},
  

任何人都知道该怎么做?

问题来自一个月前,但如果其他人需要它。 您需要在 CompositionLocalProvider 中提供一个新的 ViewConfiguration,然后它将包装您的内容。

你可以把整个东西放在一个可组合的方法中,如下所示:

    @Composable
    fun UpdateViewConfiguration(
        longPressTimeoutMillis: Long? = null,
        doubleTapTimeoutMillis: Long? = null,
        doubleTapMinTimeMillis: Long? = null,
        touchSlop: Float? = null,
        content: @Composable () -> Unit
) {
        fun ViewConfiguration.updateViewConfiguration() = object : ViewConfiguration {
            override val longPressTimeoutMillis
        get() = longPressTimeoutMillis ?: this@updateViewConfiguration.longPressTimeoutMillis

            override val doubleTapTimeoutMillis
        get() = doubleTapTimeoutMillis ?: this@updateViewConfiguration.doubleTapTimeoutMillis

            override val doubleTapMinTimeMillis
        get() =
            doubleTapMinTimeMillis ?: this@updateViewConfiguration.doubleTapMinTimeMillis

            override val touchSlop: Float
        get() = touchSlop ?: this@updateViewConfiguration.touchSlop
        }

        CompositionLocalProvider(
            LocalViewConfiguration provides LocalViewConfiguration.current.updateViewConfiguration()
        ) {
            content()
        }
    }

然后修改

    UpdateViewConfiguration(
        longPressTimeoutMillis = 200L
    ) {
        [... Your content composable ...]
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM