Необработанные данные касания / пролистывания в Flutter?По сравнению с Java с Android Studio? - PullRequest
0 голосов
/ 05 июня 2018

Я очень плохо знаком с развитием, и мне нужно принять довольно быстрое решение о том, является ли это подходящей платформой для моего проекта стажировки.

Мне нужно создать интерфейс, который требует всех направленийпроведите пальцем для перехода к различным меню (я имею в виду выполнение вложенной горизонтальной и вертикальной прокрутки, с которой у меня возникли проблемы в Android Studio) - но что более важно, я должен сохранить необработанные данные от касания / касания / пролистывания.Я не могу просто сохранить «пролистывание влево» или «пролистывание вправо», я также должен знать давление, скорость, местоположение, точный путь и т. Д.

Возможно ли это при флаттере?Как флаттер обрабатывает эти необработанные данные в отличие от Android-студии?Флаттер только определяет приблизительное направление свайпа и все?

Я пытался искать ответы весь день, но мне не хватало какого-то ключевого слова, потому что я до сих пор не смог найти ответ.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

GestureDetector является очень обширным Widget в этом отношении.Он имеет все возможности , которые вы ищете.Его более простая версия, в которую также встроен дизайн материалов, - InkWell, но в ней может отсутствовать некоторая функциональность, которую вы ищете.

С GestureDetectorобернутый вокруг Widget, вы сможете отлавливать все события попадания (вы даже можете указать HitTestBehavior (с параметром behavior).

Для ваших пользовательских взаимодействий естьреализовано множество обратных вызовов. Я связал вас с конструктором , который содержит множество полезных параметров, таких как onTapDown / Up, onVertical / HorizontalDragStart / Update / End.

Это даже не все, но с их помощью вы можете программно определить свое поведение. Позвольте мне объяснить концепцию на небольшом примере:

Offset start;

void verticalDragStart(DragStartDetails details) {
  // process the start by working with the details
  start = details.globalPosition;
  // ...
}

void verticalDragUpdate(DragUpdateDetails details) {
  // apply your logic
  Offset delta = details.delta;
  // ...
}

// use DragEnd, also for horizontal, pan etc.

@override
Widget build(BuildContext context) => GestureDectector(
  onVerticalDragStart: verticalDragStart,
  // ...
);

Я надеюсь, что вы можете представить себе всеВозможности позволяют . Вы также можете комбинировать различные обратные вызовы. Просто посмотрите на параметры в документации и поэкспериментируйте с тем, что вам подходит.

Я думаю, что это необработанные данные вы просили.

0 голосов
/ 06 июня 2018

Вы можете получить необработанные сенсорные движения, используя Listener.В следующем примере показано, как получить список точек.Он использует их, чтобы нарисовать линию, которую вы только что провели пальцем.Вы не можете определить давление, но можете определить точный путь и скорость (если вы сохранили время для каждой точки).Детектор более высокого уровня, GestureDetector, скрывает эти необработанные движения от вас, но интерпретирует их как традиционные пролистывания.

(Примечания к примеру ... shouldRepaint должны быть умнее, точки, возвращаемые слушателем,в глобальных координатах, поэтому может потребоваться преобразование в локальные (этот простой пример работает, потому что нет AppBar))

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Gesture',
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Offset> points = [];

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Listener(
        onPointerDown: (e) {
          points = [];
          points.add(e.position);
        },
        onPointerMove: (e) {
          points.add(e.position);
        },
        onPointerUp: (e) {
          points.add(e.position);
          setState(() {});
        },
        child: new CustomPaint(
          painter: new PathPainter(points),
          child: new Container(
            width: 300.0,
            height: 300.0,
            color: Colors.black12,
          ),
        ),
      ),
    );
  }
}

class PathPainter extends CustomPainter {
  List<Offset> points;
  Path path = new Path();

  PathPainter(this.points) {
    if (points.isEmpty) return;
    Offset origin = points[0];
    path.moveTo(origin.dx, origin.dy);
    for (Offset o in points) {
      path.lineTo(o.dx, o.dy);
    }
  }

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawPath(
      path,
      new Paint()
        ..color = Colors.orange
        ..style = PaintingStyle.stroke
        ..strokeWidth = 4.0,
    );
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true; // todo - determine if the path has changed
  }
}
...