Jetpack Compose 指针输入检测TapGestures 设置长按超时?

gau*_*nte 2 android long-click gesture android-jetpack-compose

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

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

Box(modifier = modifier.pointerInput(Unit) {

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

        }
    )
}
Run Code Online (Sandbox Code Playgroud)

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

pointerInput 作用域具有“val viewConfiguration”(ViewConfiguration 是一个接口),其中包含 val“longPressTimeoutMillis”。但我无法重新分配这些值(不是 longPressTimeoutMillis,也不能重新分配类 viewConfiguration),因为它们是 val 而不是 var

Box(modifier = modifier.pointerInput(Unit) {

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

        }
    )
},
  
Run Code Online (Sandbox Code Playgroud)

有人知道该怎么做吗?

ade*_*ous 9

这个问题是一个月前的问题,但如果其他人需要的话。您需要在 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()
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后修改

    UpdateViewConfiguration(
        longPressTimeoutMillis = 200L
    ) {
        [... Your content composable ...]
    }
Run Code Online (Sandbox Code Playgroud)