初始化提交
This commit is contained in:
Executable
+64
@@ -0,0 +1,64 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
/// 导航栏透明度管理 Mixin
|
||||
/// 用于统一管理页面导航栏的透明度变化
|
||||
mixin KRAppBarOpacityMixin {
|
||||
/// 导航栏透明度值
|
||||
final RxDouble kr_appBarOpacity = 0.0.obs;
|
||||
|
||||
/// 上次滚动位置
|
||||
double _lastOffset = 0;
|
||||
|
||||
/// 上次更新时间
|
||||
double _lastUpdateTime = 0;
|
||||
|
||||
/// 滚动阈值
|
||||
static const double _scrollThreshold = 100.0;
|
||||
|
||||
/// 最小透明度
|
||||
static const double _minOpacity = 0.0;
|
||||
|
||||
/// 最大透明度
|
||||
static const double _maxOpacity = 1.0;
|
||||
|
||||
/// 滚动速度因子
|
||||
static const double _scrollSpeedFactor = 0.5;
|
||||
|
||||
/// 更新导航栏透明度
|
||||
/// [scrollPixels] 当前滚动位置
|
||||
void kr_updateAppBarOpacity(double scrollPixels) {
|
||||
final currentTime = DateTime.now().millisecondsSinceEpoch.toDouble();
|
||||
final deltaTime = currentTime - _lastUpdateTime;
|
||||
_lastUpdateTime = currentTime;
|
||||
|
||||
// 计算滚动速度
|
||||
final scrollDelta = scrollPixels - _lastOffset;
|
||||
final scrollSpeed = scrollDelta.abs() / (deltaTime > 0 ? deltaTime : 1);
|
||||
_lastOffset = scrollPixels;
|
||||
|
||||
// 根据滚动位置计算基础透明度
|
||||
double baseOpacity = 0.0;
|
||||
if (scrollPixels <= 0) {
|
||||
baseOpacity = _minOpacity;
|
||||
} else if (scrollPixels >= _scrollThreshold) {
|
||||
baseOpacity = _maxOpacity;
|
||||
} else {
|
||||
// 使用平滑的插值函数计算透明度
|
||||
baseOpacity = (scrollPixels / _scrollThreshold).clamp(_minOpacity, _maxOpacity);
|
||||
// 使用平方根函数使透明度变化更加平滑
|
||||
baseOpacity = baseOpacity * baseOpacity;
|
||||
}
|
||||
|
||||
// 根据滚动速度调整透明度
|
||||
double speedFactor = (scrollSpeed * _scrollSpeedFactor).clamp(0.0, 0.5);
|
||||
double targetOpacity = baseOpacity + (speedFactor * 0.2); // 减小速度影响
|
||||
|
||||
// 平滑过渡到目标透明度
|
||||
final currentOpacity = kr_appBarOpacity.value;
|
||||
final opacityDelta = targetOpacity - currentOpacity;
|
||||
final smoothFactor = 0.3; // 平滑因子,值越小过渡越平滑
|
||||
|
||||
kr_appBarOpacity.value = (currentOpacity + opacityDelta * smoothFactor)
|
||||
.clamp(_minOpacity, _maxOpacity);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user