Exemple #1
0
        public IPromise ensureVisible(RenderObject renderObject,
                                      float alignment   = 0.0f,
                                      TimeSpan?duration = null,
                                      Curve curve       = null
                                      )
        {
            D.assert(renderObject.attached);
            RenderAbstractViewport viewport = RenderViewportUtils.of(renderObject);

            D.assert(viewport != null);

            float target = viewport.getOffsetToReveal(renderObject, alignment).offset.clamp(
                this.minScrollExtent, this.maxScrollExtent);

            if (target == this.pixels)
            {
                return(Promise.Resolved());
            }

            duration = duration ?? TimeSpan.Zero;
            if (duration == TimeSpan.Zero)
            {
                this.jumpTo(target);
                return(Promise.Resolved());
            }

            curve = curve ?? Curves.ease;
            return(this.animateTo(target, duration: duration.Value, curve: curve));
        }
        void _scrollTo(BuildContext context)
        {
            if (this._scrolling)
            {
                return;
            }

            RenderObject           contextObject = context.findRenderObject();
            RenderAbstractViewport viewport      = RenderViewportUtils.of(contextObject);

            D.assert(viewport != null);
            float margin       = this._dropAreaExtent;
            float scrollOffset = this._scrollController.offset;
            float topOffset    = Mathf.Max(this._scrollController.position.minScrollExtent,
                                           viewport.getOffsetToReveal(contextObject, 0.0f).offset - margin
                                           );
            float bottomOffset = Mathf.Min(this._scrollController.position.maxScrollExtent,
                                           viewport.getOffsetToReveal(contextObject, 1.0f).offset + margin
                                           );
            bool onScreen = scrollOffset <= topOffset && scrollOffset >= bottomOffset;

            if (!onScreen)
            {
                this._scrolling = true;
                this._scrollController.position.animateTo(
                    scrollOffset < bottomOffset ? bottomOffset : topOffset,
                    duration: this._scrollAnimationDuration,
                    curve: Curves.easeInOut
                    ).Then(() => { this.setState(() => { this._scrolling = false; }); });
            }
        }
Exemple #3
0
        public Future ensureVisible(
            RenderObject renderObject,
            float alignment   = 0.0f,
            TimeSpan?duration = null,
            Curve curve       = null,
            ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicitPolicy
            )
        {
            D.assert(renderObject.attached);
            RenderAbstractViewport viewport = RenderViewportUtils.of(renderObject);

            D.assert(viewport != null);

            float target = 0f;

            switch (alignmentPolicy)
            {
            case ScrollPositionAlignmentPolicy.explicitPolicy:
                target = viewport.getOffsetToReveal(renderObject, alignment).offset.clamp(minScrollExtent, maxScrollExtent);
                break;

            case ScrollPositionAlignmentPolicy.keepVisibleAtEnd:
                target = viewport.getOffsetToReveal(renderObject, 1.0f).offset.clamp(minScrollExtent, maxScrollExtent);
                if (target < pixels)
                {
                    target = pixels;
                }
                break;

            case ScrollPositionAlignmentPolicy.keepVisibleAtStart:
                target = viewport.getOffsetToReveal(renderObject, 0.0f).offset.clamp(minScrollExtent, maxScrollExtent);
                if (target > pixels)
                {
                    target = pixels;
                }
                break;
            }
            if (foundation_.FloatEqual(target, pixels))
            {
                return(Future.value());
            }

            duration = duration ?? TimeSpan.Zero;
            if (duration == TimeSpan.Zero)
            {
                jumpTo(target);
                return(Future.value());
            }

            curve = curve ?? Curves.ease;
            return(animateTo(target, duration: duration.Value, curve: curve));
        }