collection: sloppy scroll physics to improve scale gesture recognition
This commit is contained in:
parent
85a1ebf8b4
commit
20c40020c0
2 changed files with 27 additions and 1 deletions
|
@ -12,6 +12,7 @@ import 'package:aves/widgets/album/grid/scaling.dart';
|
||||||
import 'package:aves/widgets/album/grid/tile_extent_manager.dart';
|
import 'package:aves/widgets/album/grid/tile_extent_manager.dart';
|
||||||
import 'package:aves/widgets/common/icons.dart';
|
import 'package:aves/widgets/common/icons.dart';
|
||||||
import 'package:aves/widgets/common/scroll_thumb.dart';
|
import 'package:aves/widgets/common/scroll_thumb.dart';
|
||||||
|
import 'package:aves/widgets/common/sloppy_scroll_physics.dart';
|
||||||
import 'package:draggable_scrollbar/draggable_scrollbar.dart';
|
import 'package:draggable_scrollbar/draggable_scrollbar.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
@ -153,7 +154,7 @@ class _CollectionScrollViewState extends State<CollectionScrollView> {
|
||||||
primary: true,
|
primary: true,
|
||||||
// workaround to prevent scrolling the app bar away
|
// workaround to prevent scrolling the app bar away
|
||||||
// when there is no content and we use `SliverFillRemaining`
|
// when there is no content and we use `SliverFillRemaining`
|
||||||
physics: collection.isEmpty ? const NeverScrollableScrollPhysics() : null,
|
physics: collection.isEmpty ? const NeverScrollableScrollPhysics() : const SloppyScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
|
||||||
cacheExtent: widget.cacheExtent,
|
cacheExtent: widget.cacheExtent,
|
||||||
slivers: [
|
slivers: [
|
||||||
appBar,
|
appBar,
|
||||||
|
|
25
lib/widgets/common/sloppy_scroll_physics.dart
Normal file
25
lib/widgets/common/sloppy_scroll_physics.dart
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import 'package:flutter/gestures.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
class SloppyScrollPhysics extends ScrollPhysics {
|
||||||
|
const SloppyScrollPhysics({
|
||||||
|
this.touchSlopFactor = 1,
|
||||||
|
ScrollPhysics parent,
|
||||||
|
}) : super(parent: parent);
|
||||||
|
|
||||||
|
// in [0, 1]
|
||||||
|
// 0: most reactive but will not let other recognizers accept gestures
|
||||||
|
// 1: less reactive but gives the most leeway to other recognizers
|
||||||
|
final double touchSlopFactor;
|
||||||
|
|
||||||
|
@override
|
||||||
|
SloppyScrollPhysics applyTo(ScrollPhysics ancestor) {
|
||||||
|
return SloppyScrollPhysics(
|
||||||
|
touchSlopFactor: touchSlopFactor,
|
||||||
|
parent: buildParent(ancestor),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
double get dragStartDistanceMotionThreshold => kTouchSlop * touchSlopFactor;
|
||||||
|
}
|
Loading…
Reference in a new issue