微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Jetpack Compose中获取onTouchEvent?

如何解决如何在Jetpack Compose中获取onTouchEvent?

在正常情况下,我们可以拥有 $sheet = new \Google_Service_Sheets($this->client); $range = "'" . $sheetName . "'!" . $rangeArg . (strlen($rangeArg) == 2 ? '' : count($data) + 1000); $response = $sheet->spreadsheets_values->get($this->sheetId,$range); if (!$clear && $response && $response->values) { $c = count($response->values); $newRange = (intval(substr($rangeArg,1,1)) + $c); $newRange = substr($rangeArg,1) . $newRange . substr($rangeArg,2); $range = "'" . $sheetName . "'!" . $newRange . (count($data) + 1000); } $options = ['valueInputoption' => 'RAW']; if ($clear) { $sheet->spreadsheets_values->clear($this->sheetId,$range,new \Google_Service_Sheets_ClearValuesRequest); } $body = new \Google_Service_Sheets_ValueRange(['values' => $data,'majorDimension' => $columns ? 'COLUMNS' : 'ROWS']); $ok = $sheet->spreadsheets_values->append($this->sheetId,$body,$options); }

getLastColumn()

在Jetpack Compose中,我只能发现修饰符中有google/apiclient v2.5.0 google/apiclient-services v0.138 google/auth v1.9.0 ,该修饰符仅执行onTouchEvent中的操作。

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        when (event?.action) {
            MotionEvent.ACTION_DOWN -> {}
            MotionEvent.ACTION_MOVE -> {}
            MotionEvent.ACTION_UP -> {}
            else -> return false
        }
        invalidate()
        return true
    }

Jetpack Compose是否有等效的tapGestureFilter

解决方法

为此我们有一个单独的package,这非常有用。 有两种主要的扩展功能适合您:

  • pointerInput-docs
  • pointerInteropFilter-docs

如果您想处理和处理事件,我建议使用pointerInteropFilter的类似形式的View.onTouchEvent。它与modifier一起使用:

Column(modifier = Modifier.pointerInteropFilter {
    when (it.action) {
        MotionEvent.ACTION_DOWN -> {}
        MotionEvent.ACTION_MOVE -> {}
        MotionEvent.ACTION_UP -> {}
        else ->  false
    }
     true
})

这将是根据您指定的View.onTouchEvent样本组成的调整后代码。

P.S。不要忘记@ExperimentalPointerInput注释。

,

经过研究,看起来可以使用dragGestureFilter,并与tapGestureFilter混合

Modifier
    .dragGestureFilter(object: DragObserver {
        override fun onDrag(dragDistance: Offset): Offset {
            Log.d("Track","onActionMove ${dragDistance.x} | ${dragDistance.y}")
            return super.onDrag(dragDistance)
        }
        override fun onStart(downPosition: Offset) {
            Log.d("Track","onActionDown ${downPosition.x} | ${downPosition.y}")
            super.onStart(downPosition)
        }
        override fun onStop(velocity: Offset) {
            Log.d("Track","onStop ${velocity.x} | ${velocity.y}")
            super.onStop(velocity)
        }
    },{ true })
    .tapGestureFilter {
        Log.d("NGVL","onActionUp ${it.x} | ${it.y}")
    }

之所以仍然使用tagGestureFilter是因为onStop不提供位置,而是提供速度,因此tapGestureFilter确实提供了最后一个位置(如果需要)

,

可能有点晚了,但由于 compose 不断更新,所以我今天的做法是这样的:

Modifier
    .pointerInput(Unit) {
        detectTapGestures {...}
     }
    .pointerInput(Unit) {
        detectDragGestures { change,dragAmount ->  ...}
    })

我们还有 detectHorizontalDragGesturesdetectVerticalDragGestures 来帮助我们。

ps:1.0.0-beta03

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。