Example #1
0
        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()
                       ));
        }
Example #2
0
        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;
                }
            }
        }
Example #3
0
    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;
    }