mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-07-05 00:30:19 +08:00
59
lib/common/widgets/sliver/video_header.dart
Normal file
59
lib/common/widgets/sliver/video_header.dart
Normal file
@@ -0,0 +1,59 @@
|
||||
import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_dynamic_header.dart';
|
||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||
import 'package:flutter/foundation.dart' show clampDouble;
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class VideoHeader extends SliverPinnedDynamicHeader {
|
||||
const VideoHeader({
|
||||
super.key,
|
||||
required super.minExtent,
|
||||
required super.maxExtent,
|
||||
required this.minVideoHeight,
|
||||
required this.onScrollRatioChanged,
|
||||
required super.child,
|
||||
});
|
||||
|
||||
final double minVideoHeight;
|
||||
final ValueChanged<double> onScrollRatioChanged;
|
||||
|
||||
@override
|
||||
RenderObject createRenderObject(BuildContext context) {
|
||||
return RenderVideoHeader(
|
||||
minExtent: minExtent,
|
||||
maxExtent: maxExtent,
|
||||
minVideoHeight: minVideoHeight,
|
||||
onScrollRatioChanged: onScrollRatioChanged,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class RenderVideoHeader extends RenderSliverPinnedDynamicHeader {
|
||||
RenderVideoHeader({
|
||||
required super.minExtent,
|
||||
required super.maxExtent,
|
||||
required this.minVideoHeight,
|
||||
required this.onScrollRatioChanged,
|
||||
});
|
||||
|
||||
double? _scrollRatio;
|
||||
final double minVideoHeight;
|
||||
final ValueChanged<double> onScrollRatioChanged;
|
||||
|
||||
@override
|
||||
void performLayout() {
|
||||
super.performLayout();
|
||||
final scrollOffset = constraints.scrollOffset;
|
||||
final offset = scrollOffset - (maxExtent - minVideoHeight);
|
||||
final scrollRatio = clampDouble(
|
||||
offset.toPrecision(2) / (minVideoHeight - kToolbarHeight).toPrecision(2),
|
||||
0.0,
|
||||
1.0,
|
||||
);
|
||||
if (_scrollRatio != scrollRatio) {
|
||||
_scrollRatio = scrollRatio;
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
onScrollRatioChanged(scrollRatio);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user