在Flutter中,如果我在视图的下方,我可以在滚动控制器上使用animateTo,使我的网格视图在设置的持续时间内滚动到零偏移量,但是如果用户在滚动到顶部动画的过程中执行滚动操作,animateTo方法可以取消(注意documentation中的提示:“每当用户尝试手动滚动或启动另一个Activity时,动画将被中断,或每当动画到达视口的边缘并试图过滚动时。不仅如此,如果我将animateTo放入GestureDetector中onTap的匿名函数中,然后在它后面放置一个函数,即使animateTo方法因用户在动画结束前进行滚动操作而停止,第二个函数仍然会被执行。
这对我的情况来说是个问题。如果网格项目是写的文章,我希望用户能够点击网格项目,有网格视图滚动到顶部,淡出网格视图,并从写的文章淡入内容。滚动到顶部之前切换出网格视图的内容的书面文章是很重要的,因为我想一些标题图标的动画,然后消失时,用户向下滚动一段距离,并为标题本身移动后,标题图标动画被触发,从而在更多的空间查看内容。为了恢复标题图标,用户必须向上滚动到某个阈值,然后播放外观动画,标题图标将恢复。因此,用户能够取消animateTo方法可能会导致那些图标在我希望它们这样做的时候不会回来。但是,由于在animateTo方法之后的函数仍然会被执行,即使animateTo方法被取消,用于淡出网格视图、移除其小部件、用新的小部件替换它的后续函数(将包含来自书面帖子的内容)仍然会被执行(可能会在0处留下一个新的滚动控制器,但没有那些标题图标?有没有一种方法在设定的持续时间内滚动到网格视图的顶部(持续时间将由我的变量设置,该变量将根据滚动到顶部的距离而改变),以用户无法取消的方式?如果没有办法做到这一点,那么安慰奖将是某种方式,以防止在用户停止animateTo方法完成时执行手势检测器的onTap的后续功能。
jumpTo方法将不起作用,因为它未设置动画。我会让我的非营利组织的名字也随着向下滚动而移动,所以图标回到原来的位置也不是唯一依赖于向上滚动的东西。
2条答案
按热度按时间sbdsn5lh1#
在@pskink的评论的帮助下,我能够使用
IgnorePointer
解决我的问题。我用IgnorePointer
Package 了screen Scaffold小部件,将IgnorePointer
的忽略值设置为变量scrollAnmInProgress
,将scrollAnmInProgress
设置为true,执行滚动到顶部动画,然后将scrollAnmInProgress
的值设置回false。下面是我在GestureDetector
的onTap
方法中使用的一些代码:computeScrollToTopTime 1函数为
animateTo
方法的duration部分给予了一个持续时间(其值取决于必须进行多少滚动),该时间被四舍五入以从double类型转换为'duration'所需的int类型。有了这个持续时间,我就启动了滚动到顶部的动画,并设置了一个计时器,它的持续时间与animateTo
方法的持续时间相同。当计时器完成时(正好在animateTo
方法完成的时候),IgnorePointer
的忽略布尔值被设置回false,然后用户可以在应用程序中滚动或做其他事情。在最后的应用程序中,我可能会调用额外的函数,立即将IgnorePointer
的忽略布尔值设置回true,让用户等待内容的淡出和新内容的淡入。7uhlpewt2#
我将在这里扮演魔鬼的拥护者,并给出一个你可能不喜欢的答案。你可以使用
IgnorePointer
或类似的东西来防止用户交互,而你正在执行一个滚动,这应该可以解决你的直接问题,但这似乎…与实际问题无关。在我看来,问题是你试图手动动画一吨不同的东西,这将导致一个非常复杂的应用程序,是非常脆弱的,潜在的用户不友好。如果有一堆动画,用户可能希望通过在应用中滚动来手动取消,那么这些动画很可能不属于。
如果你做了动画描述,这可能会导致非常难以诊断错误(例如,当应用程序在滚动中关闭时会发生什么),奇怪的场景,以及一堆没有立即显现的潜在陷阱。首先想到的例子是,如果用户立即从写好的帖子中按回会发生什么-如果您手动动画了“到帖子”动画的每一步,为了获得良好的UX,您可能还应该动画“从帖子”动画,这听起来可能非常复杂。
我建议将应用程序的UX简化到最低限度-简单的动画,整页淡入淡出等,除非有一个定制动画的巨大需求。从我的经验来看,99%的用户 * 根本不在乎 * 是否有花哨的动画,只要应用程序运行良好。首先让事情正常工作,然后如果你手头有大量的额外时间,那么你可以玩更多的自定义动画。作为一名开发人员,我有时也会陷入这个陷阱,但经验告诉我,人们使用应用程序是因为它们“工作”,而不是因为它们有花哨的动画。
现在,如果你觉得你真的需要一些图标,页脚,页眉等的动画,我建议你依靠内置的hero动画,因为它们非常简单易用,功能惊人,如果需要,你可以使用一个包,如flutter villains,它可以在页面渲染后启用额外的动画。如果你需要标题随着滚动出现和消失,flutter有一个机制,在flutter slivers中。将碎片与英雄相结合,你应该能够制作一个具有花哨动画行为的应用程序,而无需在所有地方明确定义动画路径,IMO更符合Flutter的精神。