getAlignmentFromGlobalPosition static method
double
getAlignmentFromGlobalPosition(
- Offset globalPosition,
- BuildContext context,
- int itemCount, {
- Axis direction = Axis.horizontal,
Converts a global drag position to alignment (-1 to 1) along direction.
Applies rubber band resistance when dragging beyond edges.
Parameters:
globalPosition: The global position from drag detailscontext: Build context to find the render boxitemCount: Total number of itemsdirection: Axis whose coordinate and extent drive the mapping
Returns: Alignment value with rubber band resistance applied.
Implementation
static double getAlignmentFromGlobalPosition(
Offset globalPosition,
BuildContext context,
int itemCount, {
Axis direction = Axis.horizontal,
}) {
final box = context.findRenderObject()! as RenderBox;
final localPosition = box.globalToLocal(globalPosition);
// Calculate the effective draggable range
final indicatorWidth = 1.0 / itemCount;
final draggableRange = 1.0 - indicatorWidth;
final padding = indicatorWidth / 2;
// Map drag position to 0-1 range
final mainPosition =
direction == Axis.horizontal ? localPosition.dx : localPosition.dy;
final mainExtent =
direction == Axis.horizontal ? box.size.width : box.size.height;
final rawRelativeX = (mainPosition / mainExtent).clamp(0.0, 1.0);
final normalizedX = (rawRelativeX - padding) / draggableRange;
// Apply rubber band resistance for overdrag
final adjustedRelativeX = applyRubberBandResistance(normalizedX);
// Convert to -1 to 1 range
return (adjustedRelativeX * 2) - 1;
}