Как узнать, находится ли Offset внутри круга - PullRequest
0 голосов
/ 07 ноября 2018

В моем коде у меня есть CircleAvatar с границей. Я хочу знать, точно ли пользователь нажимает на границу. Для этого мне нужно проверить, находится ли тап внутри большого круга (Container), но не внутри маленького круга (CircleAvatar). Кто-нибудь знает, как я могу это проверить?

Widget build(BuildContext context) {
  return Listener(
    child: Container(
      key: key,
      padding: EdgeInsets.all(8.0),
      decoration: ShapeDecoration(shape: CircleBorder(), color: Colors.yellow),
      child: CircleAvatar(
        backgroundImage: NetworkImage(widget.imgSrc),
        radius: 60.0,
      ),
    ),
    onPointerDown: (event) {
      if (renderBox == null) {
        renderBox = key.currentContext?.findRenderObject();
      }
      Rect rect = renderBox.paintBounds;
      // todo ......
    },
  );
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Возможно, это не лучший способ, но я нашел какое-то решение

Rect bigRect = renderBox.paintBounds.shift(renderBox?.localToGlobal(Offset.zero));
Rect smallRect = bigRect.deflate(padding);
Path path = Path()
  ..fillType = PathFillType.evenOdd
  ..addOval(bigRect)
  ..addOval(smallRect);
if (path.contains(event.position)) { // todo...

P.S. Решение Малдека тоже можно использовать, оно работает, но я искал другой тип, например contains

0 голосов
/ 07 ноября 2018

Вы должны использовать теорему Пифагора, чтобы проверить, находится ли смещение в круге:

import 'dart:math';

/// check if a [point] is in a circle of a given [radius]
bool isPointInside(Offset point, double radius) =>
  pow(point.dx, 2) + pow(point.dy, 2) < pow(radius, 2);

Сделайте это для большого и малого круга и проверьте, соответствуют ли результаты тем, что вы хотите.

Редактировать: удалил sqrt в пользу pow (radius), как предложено @ randal-schwartz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...