我正在基于以下方式在动画中实现动画示例: https://www.behance.net/gallery/55023357/Flyer-Flight-Booking
其中一个动画显示一个列表,该列表的填充根据用户滚动而变化。为此,我需要知道用户的滚动速度何时高于或低于某个阈值。
我知道我可以通过将ListView封装在NotificationListener中来访问ScrollNotifications。通知存储诸如空闲,反向和向前滚动,哪种滚动交互类型等信息。
不幸的是,它似乎没有存储有关增量滚动偏移量或速度的任何信息。我试图从附加到ListView的ScrollController访问ScrollActivity。该活动似乎受到保护,可能会在发布时中断我的应用程序。这是一些代码:
ScrollController _scrollController; // ListView controller
AnimationController _itemSpacingController; // Smooth change of padding for the list items
// Build the list
Widget _buildSectionPage() {
var section = widget.section;
var itemCount = section.cells.length;
return NotificationListener<ScrollNotification>(
onNotification: _onScroll,
child: ListView.builder(
controller: _scrollController,
itemBuilder: (BuildContext context, int index) {
return _buildSectionCell(
context, section.cells[index], index, itemCount);
},
itemCount: itemCount,
padding: EdgeInsets.only(right: 8.0, top: 16.0),
itemExtent: SectionView._cellHeight +
(1.0 + _itemSpacingController.value) * DEFAULT_ITEM_SPACING,
physics: AlwaysScrollableScrollPhysics(),
),
);
}
_buildSectionPage()设置列表并连接侦听器。当ListView滚动时,他们不能 _onScroll()。
bool _onScroll(ScrollNotification notification) {
if (notification is UserScrollNotification) {
if (notification.direction == ScrollDirection.idle) {
_itemSpacingController.reverse();
} else {
if (_scrollController.position.activity.velocity <= 0.5) {
_itemSpacingController.forward();
}
}
}
return false;
}
_scrollController.position.activity.velocity
受保护。这似乎是获取滚动事件当前速度的唯一方法。您是否知道其他方法来获取ScollNotification的当前速度?