public override Simulation createBallisticSimulation(ScrollMetrics position, float velocity) { D.assert( position is _FixedExtentScrollPosition, () => "FixedExtentScrollPhysics can only be used with Scrollables that uses " + "the FixedExtentScrollController" ); _FixedExtentScrollPosition metrics = (_FixedExtentScrollPosition)position; if ((velocity <= 0.0f && metrics.pixels <= metrics.minScrollExtent) || (velocity >= 0.0f && metrics.pixels >= metrics.maxScrollExtent)) { return(base.createBallisticSimulation(metrics, velocity)); } Simulation testFrictionSimulation = base.createBallisticSimulation(metrics, velocity); if (testFrictionSimulation != null && (testFrictionSimulation.x(float.PositiveInfinity) == metrics.minScrollExtent || testFrictionSimulation.x(float.PositiveInfinity) == metrics.maxScrollExtent)) { return(base.createBallisticSimulation(metrics, velocity)); } int settlingItemIndex = ListWheelScrollViewUtils._getItemFromOffset( offset: testFrictionSimulation?.x(float.PositiveInfinity) ?? metrics.pixels, itemExtent: metrics.itemExtent, minScrollExtent: metrics.minScrollExtent, maxScrollExtent: metrics.maxScrollExtent ); float settlingPixels = settlingItemIndex * metrics.itemExtent; if (velocity.abs() < tolerance.velocity && (settlingPixels - metrics.pixels).abs() < tolerance.distance) { return(null); } if (settlingItemIndex == metrics.itemIndex) { return(new SpringSimulation( spring, metrics.pixels, settlingPixels, velocity, tolerance: tolerance )); } return(FrictionSimulation.through( metrics.pixels, settlingPixels, velocity, tolerance.velocity * velocity.sign() )); }
public BouncingScrollSimulation( float position, float velocity, float leadingExtent, float trailingExtent, SpringDescription spring, Tolerance tolerance = null ) : base(tolerance: tolerance) { D.assert(leadingExtent <= trailingExtent); D.assert(spring != null); this.leadingExtent = leadingExtent; this.trailingExtent = trailingExtent; this.spring = spring; if (position < leadingExtent) { _springSimulation = _underscrollSimulation(position, velocity); _springTime = float.NegativeInfinity; } else if (position > trailingExtent) { _springSimulation = _overscrollSimulation(position, velocity); _springTime = float.NegativeInfinity; } else { _frictionSimulation = new FrictionSimulation(0.135f, position, velocity); float finalX = _frictionSimulation.finalX; if (velocity > 0.0f && finalX > trailingExtent) { _springTime = _frictionSimulation.timeAtX(trailingExtent); _springSimulation = _overscrollSimulation( trailingExtent, Mathf.Min(_frictionSimulation.dx(_springTime), maxSpringTransferVelocity) ); D.assert(_springTime.isFinite()); } else if (velocity < 0.0f && finalX < leadingExtent) { _springTime = _frictionSimulation.timeAtX(leadingExtent); _springSimulation = _underscrollSimulation( leadingExtent, Mathf.Min(_frictionSimulation.dx(_springTime), maxSpringTransferVelocity) ); D.assert(_springTime.isFinite()); } else { _springTime = float.PositiveInfinity; } } }
void Start() { m_initPosition = transform.position; m_rb = GetComponent <Rigidbody>(); m_initImpulse = GetComponent <InitialImpulse>(); m_launchImpulse = GetComponent <LaunchImpulse>(); m_frictionSim = GetComponent <FrictionSimulation>(); m_soundManager = FindObjectOfType <SoundManager>(); m_frictionSim.enabled = false; }