Проблема с распознаванием жестов - PullRequest
0 голосов
/ 09 мая 2020

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

 class Panner extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => PannerState();
}
class PannerState extends State<Panner> {
  String assets ;
  Uint8List pageData;
  double scrollPosx=0,scrollPosy=0,previousPosx=0,previousPosy=0;
  double scale = 1.0, previousScale = 1.0;
  double originalImageHeight, imageHeight;
  Offset _offset = Offset.zero;
  Offset _previousOffset, _startingFocalPoint;
  ScrollController _verticalController = ScrollController();
  ScrollController _horizontalController = ScrollController();

  _findPosition()
  {    

        _previousOffset=Offset(-scrollPosx,-scrollPosy);
        previousPosx=-scrollPosx;
        previousPosy=-scrollPosy;
    }
  }
  Future _getImage(BuildContext context) async {
    if(pageData == null)
    {
      assets = 'images/squirrel.jpg';
      imageHeight = originalImageHeight = MediaQuery.of(context).size.height; 
      pageData = ((await rootBundle.load(assets)).buffer.asUint8List());
    }
  }
  _onScaleUpdate(ScaleUpdateDetails details) {
    scale = details.scale * previousScale;
    if(scale!=1.0) {
      if (scale < 0.5) {
        scale = 0.5;
      }
      imageHeight = originalImageHeight * scale;
      setState(() {});
      final Offset normalizedOffset = (_startingFocalPoint -
          _previousOffset) / previousScale;
      _offset = details.focalPoint - normalizedOffset * scale;
      _horizontalController.jumpTo(-_offset.dx);
      _verticalController.jumpTo(-_offset.dy);

    }

  }

  _onScaleStart(ScaleStartDetails details) {
    _startingFocalPoint = details.focalPoint;
    previousScale = scale;
    _previousOffset = _offset;
    scrollPosx=_horizontalController.position.pixels;
    scrollPosy=_verticalController.position.pixels;
    if(previousPosx!=scrollPosx || previousPosy!=scrollPosy)
      {
        _findPosition();
      }
setState(() {});

  }
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _getImage(context),
        builder: (context, snapshot) {
          if(pageData==null)
          {
            return CircularProgressIndicator();
          }
       return  GestureDetector(
                onScaleStart: _onScaleStart,
                onScaleUpdate: _onScaleUpdate,
                // onScaleEnd: _onScaleEnd,
              child: SingleChildScrollView(
                scrollDirection: Axis.horizontal,
                controller: _horizontalController,
                child: SingleChildScrollView(
                    scrollDirection: Axis.vertical,
                    controller: _verticalController,
                 child: Align(
                    alignment: FractionalOffset.center,
                      child: Image.memory(
                        pageData,
                        height: imageHeight,
                        fit: BoxFit.cover,
                       width: imageWidth,
                      ),
                    )
                ),
              )
              ) ;
        });
  }
}`

'Я использую жест масштабирования для увеличения изображения и использую два виджета singlechildscrollview для горизонтальной и вертикальной прокрутки'

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