Flutter 如何在Flatter中使用手势识别器实现页面视图的滑动手势?
我正在尝试从Instagram重新创建MediaPicker 此屏幕的当前结构如下所示:Flutter 如何在Flatter中使用手势识别器实现页面视图的滑动手势?,flutter,flutter-animation,flutter-pageview,Flutter,Flutter Animation,Flutter Pageview,我正在尝试从Instagram重新创建MediaPicker 此屏幕的当前结构如下所示: return Scaffold( appBar: buildAppBar(context), body: PageView( physics: NeverScrollableScrollPhysics(), //disable the "normal" pageview scrolling onPageChanged: (i
return Scaffold(
appBar: buildAppBar(context),
body: PageView(
physics: NeverScrollableScrollPhysics(), //disable the "normal" pageview scrolling
onPageChanged: (index) {
setState(() {
pageIndex = index;
});
},
controller: pageController,
children: [
Column(
children: [
Expanded(
flex: 3,
child: buildPreviewWidget(selection, _buildCropPreview), //this cropview has a gesture recognizer on it
),
const SizedBox(height: 2),
Expanded(
flex: 2,
child: GestureDetector(
onHorizontalDragStart: (details) {
double offset = screenWidth - details.localPosition.dx;
pageController.jumpTo(offset);
},
onHorizontalDragUpdate: (details) {
double offset = screenWidth - details.localPosition.dx;
pageController.jumpTo(offset);
},
child:MediaGrid( //this is the media grid
allowMultiSelection: multiSelectable,
collection: allCollection),
)),
],
),
CameraScreen(),
],
),
bottomNavigationBar: buildBottomNavigationBar(),
);
最初的问题是,每当我在cropview中拖动时,页面视图的滑动手势就会被触发,这不是我想要的
因此,我的想法是禁用使用NeverScrollableScrollPhysics()
滚动的标准方式,然后使用GestureRecognitizer()
仅包装MediaGrid()
,这样我就可以借助PageViewspageController.jumpTo()
实现相同的滑动动画,但只能在MediaGrid()上
然而,我的实现似乎很糟糕,因为页面视图像这样断断续续
如何平滑口吃,或者有更好的方法来实现这一点吗?在
onHorizontalDragUpdate
案例中,尝试pageController.jumpTo(pageController.offset-details.delta.dx)
-口吃可能与更改的“本地位置”有关抱歉,我还没有机会测试它,将尽快让您知道。@pskink似乎可以大大改善口吃,但页面视图仍希望捕捉到其中一个屏幕。所以当我拖动它到50%偏移量时,它会自动移动。我觉得这是因为我只在水平DragUpdate中调用了pageController.jumpTo()
,所以当我停下来并只将屏幕保持在50%时,事件就不会被触发了。只要我触摸屏幕,有没有办法制作动画?很可能你需要onHorizontalDragEnd
我终于找到了解决方案。结果表明,PageView有一个默认为true的pageSnapping
属性。现在,当onHorizontalDragStart
运行时,我将pageSnapping
设置为false,当onHorizontalDragEnd
运行得像个符咒时,我将其设置为true。谢谢