您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

223 行
8.7 KiB

using System;
using Unity.UIWidgets.animation;
using Unity.UIWidgets.ui;
using UnityEngine;
namespace Unity.UIWidgets.material {
public static class FloatingActionButtonLocationUtils {
public const float kFloatingActionButtonMargin = 16.0f;
public static readonly TimeSpan kFloatingActionButtonSegue = new TimeSpan(0, 0, 0, 0, 200);
public const float kFloatingActionButtonTurnInterval = 0.125f;
}
public abstract class FloatingActionButtonLocation {
protected FloatingActionButtonLocation() {
}
public static readonly FloatingActionButtonLocation endFloat = new _EndFloatFabLocation();
public static readonly FloatingActionButtonLocation centerFloat = new _CenterFloatFabLocation();
public static readonly FloatingActionButtonLocation endDocked = new _EndDockedFloatingActionButtonLocation();
public static readonly FloatingActionButtonLocation centerDocked =
new _CenterDockedFloatingActionButtonLocation();
public abstract Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry);
public override string ToString() {
return this.GetType().ToString();
}
}
class _CenterFloatFabLocation : FloatingActionButtonLocation {
public _CenterFloatFabLocation() {
}
public override Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
float fabX = (scaffoldGeometry.scaffoldSize.width - scaffoldGeometry.floatingActionButtonSize.width) / 2.0f;
float contentBottom = scaffoldGeometry.contentBottom;
float bottomSheetHeight = scaffoldGeometry.bottomSheetSize.height;
float fabHeight = scaffoldGeometry.floatingActionButtonSize.height;
float snackBarHeight = scaffoldGeometry.snackBarSize.height;
float fabY = contentBottom - fabHeight - FloatingActionButtonLocationUtils.kFloatingActionButtonMargin;
if (snackBarHeight > 0.0f) {
fabY = Mathf.Min(fabY,
contentBottom - snackBarHeight - fabHeight -
FloatingActionButtonLocationUtils.kFloatingActionButtonMargin);
}
if (bottomSheetHeight > 0.0f) {
fabY = Mathf.Min(fabY, contentBottom - bottomSheetHeight - fabHeight / 2.0f);
}
return new Offset(fabX, fabY);
}
}
class _EndFloatFabLocation : FloatingActionButtonLocation {
public _EndFloatFabLocation() {
}
public override Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
float endPadding = scaffoldGeometry.minInsets.right;
float fabX = scaffoldGeometry.scaffoldSize.width - scaffoldGeometry.floatingActionButtonSize.width -
FloatingActionButtonLocationUtils.kFloatingActionButtonMargin - endPadding;
float contentBottom = scaffoldGeometry.contentBottom;
float bottomSheetHeight = scaffoldGeometry.bottomSheetSize.height;
float fabHeight = scaffoldGeometry.floatingActionButtonSize.height;
float snackBarHeight = scaffoldGeometry.snackBarSize.height;
float fabY = contentBottom - fabHeight - FloatingActionButtonLocationUtils.kFloatingActionButtonMargin;
if (snackBarHeight > 0.0f) {
fabY = Mathf.Min(fabY,
contentBottom - snackBarHeight - fabHeight -
FloatingActionButtonLocationUtils.kFloatingActionButtonMargin);
}
if (bottomSheetHeight > 0.0f) {
fabY = Mathf.Min(fabY, contentBottom - bottomSheetHeight - fabHeight / 2.0f);
}
return new Offset(fabX, fabY);
}
}
abstract class _DockedFloatingActionButtonLocation : FloatingActionButtonLocation {
protected _DockedFloatingActionButtonLocation() {
}
protected float getDockedY(ScaffoldPrelayoutGeometry scaffoldGeometry) {
float contentBottom = scaffoldGeometry.contentBottom;
float bottomSheetHeight = scaffoldGeometry.bottomSheetSize.height;
float fabHeight = scaffoldGeometry.floatingActionButtonSize.height;
float snackBarHeight = scaffoldGeometry.snackBarSize.height;
float fabY = contentBottom - fabHeight / 2.0f;
if (snackBarHeight > 0.0f) {
fabY = Mathf.Min(fabY,
contentBottom - snackBarHeight - fabHeight -
FloatingActionButtonLocationUtils.kFloatingActionButtonMargin);
}
if (bottomSheetHeight > 0.0f) {
fabY = Mathf.Min(fabY, contentBottom - bottomSheetHeight - fabHeight / 2.0f);
}
float maxFabY = scaffoldGeometry.scaffoldSize.height - fabHeight;
return Mathf.Min(maxFabY, fabY);
}
}
class _EndDockedFloatingActionButtonLocation : _DockedFloatingActionButtonLocation {
public _EndDockedFloatingActionButtonLocation() {
}
public override Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
float endPadding = scaffoldGeometry.minInsets.right;
float fabX = scaffoldGeometry.scaffoldSize.width - scaffoldGeometry.floatingActionButtonSize.width -
FloatingActionButtonLocationUtils.kFloatingActionButtonMargin - endPadding;
return new Offset(fabX, this.getDockedY(scaffoldGeometry));
}
}
class _CenterDockedFloatingActionButtonLocation : _DockedFloatingActionButtonLocation {
public _CenterDockedFloatingActionButtonLocation() {
}
public override Offset getOffset(ScaffoldPrelayoutGeometry scaffoldGeometry) {
float fabX = (scaffoldGeometry.scaffoldSize.width - scaffoldGeometry.floatingActionButtonSize.width) / 2.0f;
return new Offset(fabX, this.getDockedY(scaffoldGeometry));
}
}
public abstract class FloatingActionButtonAnimator {
protected FloatingActionButtonAnimator() {
}
public static readonly FloatingActionButtonAnimator scaling = new _ScalingFabMotionAnimator();
public abstract Offset getOffset(Offset begin, Offset end, float progress);
public abstract Animation<float> getScaleAnimation(Animation<float> parent);
public abstract Animation<float> getRotationAnimation(Animation<float> parent);
public virtual float getAnimationRestart(float previousValue) {
return 0.0f;
}
public override string ToString() {
return this.GetType().ToString();
}
}
class _ScalingFabMotionAnimator : FloatingActionButtonAnimator {
public _ScalingFabMotionAnimator() {
}
public override Offset getOffset(Offset begin, Offset end, float progress) {
if (progress < 0.5f) {
return begin;
}
else {
return end;
}
}
public override Animation<float> getScaleAnimation(Animation<float> parent) {
Curve curve = new Interval(0.5f, 1.0f, curve: Curves.ease);
return new _AnimationSwap<float>(
new ReverseAnimation(parent.drive(new CurveTween(curve: curve.flipped))),
parent.drive(new CurveTween(curve: curve)),
parent,
0.5f
);
}
static readonly Animatable<float> _rotationTween = new FloatTween(
begin: 1.0f - FloatingActionButtonLocationUtils.kFloatingActionButtonTurnInterval * 2.0f,
end: 1.0f
);
static readonly Animatable<float> _thresholdCenterTween = new CurveTween(curve: new Threshold(0.5f));
public override Animation<float> getRotationAnimation(Animation<float> parent) {
return new _AnimationSwap<float>(
parent.drive(_rotationTween),
new ReverseAnimation(parent.drive(_thresholdCenterTween)),
parent,
0.5f
);
}
public override float getAnimationRestart(float previousValue) {
return Mathf.Min(1.0f - previousValue, previousValue);
}
}
class _AnimationSwap<T> : CompoundAnimation<T> {
public _AnimationSwap(
Animation<T> first,
Animation<T> next,
Animation<float> parent,
float swapThreshold
) : base(first: first, next: next) {
this.parent = parent;
this.swapThreshold = swapThreshold;
}
public readonly Animation<float> parent;
public readonly float swapThreshold;
public override T value {
get { return this.parent.value < this.swapThreshold ? this.first.value : this.next.value; }
}
}
}