您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
221 行
7.6 KiB
221 行
7.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using RSG;
|
|
using Unity.UIWidgets.animation;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.gestures;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.physics;
|
|
using Unity.UIWidgets.rendering;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.widgets {
|
|
public class ScrollPositionWithSingleContext : ScrollPosition, ScrollActivityDelegate {
|
|
public ScrollPositionWithSingleContext(
|
|
ScrollPhysics physics = null,
|
|
ScrollContext context = null,
|
|
float? initialPixels = 0.0f,
|
|
bool keepScrollOffset = true,
|
|
ScrollPosition oldPosition = null,
|
|
string debugLabel = null
|
|
) : base(
|
|
physics: physics,
|
|
context: context,
|
|
keepScrollOffset: keepScrollOffset,
|
|
oldPosition: oldPosition,
|
|
debugLabel: debugLabel
|
|
) {
|
|
if (this._pixels == null && initialPixels != null) {
|
|
this.correctPixels(initialPixels.Value);
|
|
}
|
|
|
|
if (this.activity == null) {
|
|
this.goIdle();
|
|
}
|
|
|
|
D.assert(this.activity != null);
|
|
}
|
|
|
|
|
|
float _heldPreviousVelocity = 0.0f;
|
|
|
|
public override AxisDirection axisDirection {
|
|
get { return this.context.axisDirection; }
|
|
}
|
|
|
|
public override float setPixels(float newPixels) {
|
|
D.assert(this.activity.isScrolling);
|
|
return base.setPixels(newPixels);
|
|
}
|
|
|
|
protected override void absorb(ScrollPosition other) {
|
|
base.absorb(other);
|
|
if (!(other is ScrollPositionWithSingleContext)) {
|
|
this.goIdle();
|
|
return;
|
|
}
|
|
|
|
this.activity.updateDelegate(this);
|
|
ScrollPositionWithSingleContext typedOther = (ScrollPositionWithSingleContext) other;
|
|
this._userScrollDirection = typedOther._userScrollDirection;
|
|
D.assert(this._currentDrag == null);
|
|
if (typedOther._currentDrag != null) {
|
|
this._currentDrag = typedOther._currentDrag;
|
|
this._currentDrag.updateDelegate(this);
|
|
typedOther._currentDrag = null;
|
|
}
|
|
}
|
|
|
|
protected override void applyNewDimensions() {
|
|
base.applyNewDimensions();
|
|
this.context.setCanDrag(this.physics.shouldAcceptUserOffset(this));
|
|
}
|
|
|
|
public override void beginActivity(ScrollActivity newActivity) {
|
|
this._heldPreviousVelocity = 0.0f;
|
|
if (newActivity == null) {
|
|
return;
|
|
}
|
|
|
|
D.assert(newActivity.del == this);
|
|
base.beginActivity(newActivity);
|
|
if (this._currentDrag != null) {
|
|
this._currentDrag.dispose();
|
|
this._currentDrag = null;
|
|
}
|
|
|
|
if (!this.activity.isScrolling) {
|
|
this.updateUserScrollDirection(ScrollDirection.idle);
|
|
}
|
|
}
|
|
|
|
public virtual void applyUserScrollOffset(float delta) {
|
|
this.updateUserScrollDirection(delta > 0.0 ? ScrollDirection.forward : ScrollDirection.reverse);
|
|
|
|
var pixel = this.pixels - this.physics.applyPhysicsToUserOffset(this, delta);
|
|
if (pixel < this.minScrollExtent) {
|
|
pixel = this.minScrollExtent;
|
|
}
|
|
|
|
if (pixel > this.maxScrollExtent) {
|
|
pixel = this.maxScrollExtent;
|
|
}
|
|
|
|
this.setPixels(pixel);
|
|
}
|
|
|
|
public virtual void applyUserOffset(float delta) {
|
|
this.updateUserScrollDirection(delta > 0.0 ? ScrollDirection.forward : ScrollDirection.reverse);
|
|
this.setPixels(this.pixels - this.physics.applyPhysicsToUserOffset(this, delta));
|
|
}
|
|
|
|
public void goIdle() {
|
|
this.beginActivity(new IdleScrollActivity(this));
|
|
}
|
|
|
|
public void goBallistic(float velocity) {
|
|
D.assert(this._pixels != null);
|
|
Simulation simulation = this.physics.createBallisticSimulation(this, velocity);
|
|
if (simulation != null) {
|
|
this.beginActivity(new BallisticScrollActivity(this, simulation, this.context.vsync));
|
|
}
|
|
else {
|
|
this.goIdle();
|
|
}
|
|
}
|
|
|
|
public override ScrollDirection userScrollDirection {
|
|
get { return this._userScrollDirection; }
|
|
}
|
|
|
|
ScrollDirection _userScrollDirection = ScrollDirection.idle;
|
|
|
|
protected void updateUserScrollDirection(ScrollDirection value) {
|
|
if (this.userScrollDirection == value) {
|
|
return;
|
|
}
|
|
|
|
this._userScrollDirection = value;
|
|
this.didUpdateScrollDirection(value);
|
|
}
|
|
|
|
public override IPromise animateTo(float to,
|
|
TimeSpan duration,
|
|
Curve curve
|
|
) {
|
|
if (PhysicsUtils.nearEqual(to, this.pixels, this.physics.tolerance.distance)) {
|
|
this.jumpTo(to);
|
|
return Promise.Resolved();
|
|
}
|
|
|
|
DrivenScrollActivity activity = new DrivenScrollActivity(
|
|
this,
|
|
from: this.pixels,
|
|
to: to,
|
|
duration: duration,
|
|
curve: curve,
|
|
vsync: this.context.vsync
|
|
);
|
|
this.beginActivity(activity);
|
|
return activity.done;
|
|
}
|
|
|
|
public override void jumpTo(float value) {
|
|
this.goIdle();
|
|
if (this.pixels != value) {
|
|
float oldPixels = this.pixels;
|
|
this.forcePixels(value);
|
|
// this.notifyListeners(); already in forcePixels, no need here.
|
|
this.didStartScroll();
|
|
this.didUpdateScrollPositionBy(this.pixels - oldPixels);
|
|
this.didEndScroll();
|
|
}
|
|
|
|
this.goBallistic(0.0f);
|
|
}
|
|
|
|
public override ScrollHoldController hold(VoidCallback holdCancelCallback) {
|
|
float previousVelocity = this.activity.velocity;
|
|
HoldScrollActivity holdActivity = new HoldScrollActivity(
|
|
del: this,
|
|
onHoldCanceled: holdCancelCallback
|
|
);
|
|
this.beginActivity(holdActivity);
|
|
this._heldPreviousVelocity = previousVelocity;
|
|
return holdActivity;
|
|
}
|
|
|
|
ScrollDragController _currentDrag;
|
|
|
|
public override Drag drag(DragStartDetails details, VoidCallback dragCancelCallback) {
|
|
ScrollDragController drag = new ScrollDragController(
|
|
del: this,
|
|
details: details,
|
|
onDragCanceled: dragCancelCallback,
|
|
carriedVelocity: this.physics.carriedMomentum(this._heldPreviousVelocity),
|
|
motionStartDistanceThreshold: this.physics.dragStartDistanceMotionThreshold
|
|
);
|
|
this.beginActivity(new DragScrollActivity(this, drag));
|
|
D.assert(this._currentDrag == null);
|
|
this._currentDrag = drag;
|
|
return drag;
|
|
}
|
|
|
|
public override void dispose() {
|
|
if (this._currentDrag != null) {
|
|
this._currentDrag.dispose();
|
|
this._currentDrag = null;
|
|
}
|
|
|
|
base.dispose();
|
|
}
|
|
|
|
protected override void debugFillDescription(List<string> description) {
|
|
base.debugFillDescription(description);
|
|
description.Add(this.context.GetType().ToString());
|
|
description.Add(this.physics.ToString());
|
|
description.Add(this.activity?.ToString());
|
|
description.Add(this.userScrollDirection.ToString());
|
|
}
|
|
}
|
|
}
|