private void DragEventHandler(object sender, DragEventArgs e) { base.ResetState(false); if (this.animation) { this.flickDistance = Vector2.Zero; this.animation = false; } this.animationState = ScrollPanel.AnimationState.Drag; if (this.ScrollBarVisibility == ScrollBarVisibility.ScrollingVisible) { this.scrollBarH.Visible = this.isHorizontalScrollable(); this.scrollBarV.Visible = this.isVerticalScrollable(); } if (this.isHorizontalScrollable()) { this.panel.X += e.Distance.X; this.panel.X = MathUtility.Clamp <float>(this.panel.X, this.Width - this.panel.Width, 0f); } if (this.isVerticalScrollable()) { this.panel.Y += e.Distance.Y; this.panel.Y = MathUtility.Clamp <float>(this.panel.Y, this.Height - this.panel.Height, 0f); } this.UpdateScrollBarPos(); }
protected override void OnUpdate(float elapsedTime) { base.OnUpdate(elapsedTime); if (!this.animation) { return; } if (Math.Abs(this.flickDistance.X) < 0.5f && Math.Abs(this.flickDistance.Y) < 0.5f) { this.flickDistance = Vector2.Zero; this.animationState = ScrollPanel.AnimationState.None; this.animation = false; this.UpdateView(); return; } this.animationElapsedTime += elapsedTime; float num = (float)Math.Exp((double)(-(double)this.animationElapsedTime * 0.00539892027f)); this.flickDistance = this.startFlickDistance * num; if (Math.Abs(this.flickDistance.X) > 0.5f) { this.panel.X = this.startPanelPos.X + (this.startFlickDistance.X - this.flickDistance.X) / 0.09f; this.panel.X = FMath.Clamp(this.panel.X, this.Width - this.panel.Width, 0f); } if (Math.Abs(this.flickDistance.Y) > 0.5f) { this.panel.Y = this.startPanelPos.Y + (this.startFlickDistance.Y - this.flickDistance.Y) / 0.09f; this.panel.Y = FMath.Clamp(this.panel.Y, this.Height - this.panel.Height, 0f); } this.UpdateScrollBarPos(); }
protected internal override void OnTouchEvent(TouchEventCollection touchEvents) { base.OnTouchEvent(touchEvents); if (touchEvents.PrimaryTouchEvent.Type == TouchEventType.Up && !this.animation) { if (this.ScrollBarVisibility == ScrollBarVisibility.ScrollingVisible) { this.scrollBarH.Visible = false; this.scrollBarV.Visible = false; } this.animationState = ScrollPanel.AnimationState.None; } if (this.animationState != ScrollPanel.AnimationState.Drag && this.animationState != ScrollPanel.AnimationState.Flick) { touchEvents.Forward = true; } }
public ScrollPanel() { this.panel = new Panel(); this.panel.Clip = true; base.AddChildLast(this.panel); this.scrollBarH = new ScrollBar(ScrollBarOrientation.Horizontal); this.scrollBarV = new ScrollBar(ScrollBarOrientation.Vertical); base.AddChildLast(this.scrollBarH); base.AddChildLast(this.scrollBarV); this.animationState = ScrollPanel.AnimationState.None; base.Clip = true; base.HookChildTouchEvent = true; DragGestureDetector dragGestureDetector = new DragGestureDetector(); dragGestureDetector.DragDetected += new EventHandler <DragEventArgs>(this.DragEventHandler); base.AddGestureDetector(dragGestureDetector); FlickGestureDetector flickGestureDetector = new FlickGestureDetector(); flickGestureDetector.FlickDetected += new EventHandler <FlickEventArgs>(this.FlickEventHandler); base.AddGestureDetector(flickGestureDetector); this.UpdateView(); }
private void FlickEventHandler(object sender, FlickEventArgs e) { base.ResetState(false); this.animationState = ScrollPanel.AnimationState.Flick; if (this.ScrollBarVisibility == ScrollBarVisibility.ScrollingVisible) { this.scrollBarH.Visible = this.isHorizontalScrollable(); this.scrollBarV.Visible = this.isVerticalScrollable(); } if (this.isHorizontalScrollable()) { this.flickDistance.X = e.Speed.X * 0.03f; } if (this.isVerticalScrollable()) { this.flickDistance.Y = e.Speed.Y * 0.03f; } this.startFlickDistance = this.flickDistance; this.startPanelPos.X = this.panel.X; this.startPanelPos.Y = this.panel.Y; this.animationElapsedTime = 0f; this.animation = true; }