如何在Jetpack Compose中获取onTouchEvent?

时间:2020-10-28 11:31:35

标签: android android-jetpack-compose

在正常情况下,我们可以拥有 $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, 0, 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, $range, $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

3 个答案:

答案 0 :(得分:1)

为此我们有一个单独的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注释。

答案 1 :(得分:0)

经过研究,看起来可以使用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确实提供了最后一个位置(如果需要)

答案 2 :(得分:0)

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

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

我们还有 detectHorizontalDragGesturesdetectVerticalDragGestures 来帮助我们。

ps:1.0.0-beta03