UNPKG

laya-coreui-es

Version:

laya核心库、ui库es版本,剔除了媒体、TTF等功能。基于 LayaAir-release_2.12.0 修改

506 lines (505 loc) 18.4 kB
import { UIComponent } from "./UIComponent"; import { Button } from "./Button"; import { Slider } from "./Slider"; import { UIConfig } from "./../../UIConfig"; import { Styles } from "./Styles"; import { Event } from "../events/Event"; import { Point } from "../maths/Point"; import { Loader } from "../net/Loader"; import { Ease } from "../utils/Ease"; import { Handler } from "../utils/Handler"; import { Tween } from "../utils/Tween"; import { ILaya } from "../../ILaya"; export class ScrollBar extends UIComponent { constructor(skin = null) { super(); this.rollRatio = 0.97; this.scaleBar = true; this.autoHide = false; this.elasticDistance = 0; this.elasticBackTime = 500; this._showButtons = UIConfig.showButtons; this._scrollSize = 1; this._thumbPercent = 1; this._lastOffset = 0; this._checkElastic = false; this._isElastic = false; this._hide = false; this._clickOnly = true; this._touchScrollEnable = UIConfig.touchScrollEnable; this._mouseWheelEnable = UIConfig.mouseWheelEnable; this.skin = skin; this.max = 1; } destroy(destroyChild = true) { this.stopScroll(); this.target = null; super.destroy(destroyChild); this.upButton && this.upButton.destroy(destroyChild); this.downButton && this.downButton.destroy(destroyChild); this.slider && this.slider.destroy(destroyChild); this.upButton = this.downButton = null; this.slider = null; this.changeHandler = null; this._offsets = null; } createChildren() { this.addChild(this.slider = new Slider()); this.addChild(this.upButton = new Button()); this.addChild(this.downButton = new Button()); } initialize() { this.slider.showLabel = false; this.slider.tick = 0; this.slider.on(Event.CHANGE, this, this.onSliderChange); this.slider.setSlider(0, 0, 0); this.upButton.on(Event.MOUSE_DOWN, this, this.onButtonMouseDown); this.downButton.on(Event.MOUSE_DOWN, this, this.onButtonMouseDown); } onSliderChange() { if (this._value != this.slider.value) this.value = this.slider.value; } onButtonMouseDown(e) { var isUp = e.currentTarget === this.upButton; this.slide(isUp); ILaya.timer.once(Styles.scrollBarDelayTime, this, this.startLoop, [isUp]); ILaya.stage.once(Event.MOUSE_UP, this, this.onStageMouseUp); } startLoop(isUp) { ILaya.timer.frameLoop(1, this, this.slide, [isUp]); } slide(isUp) { if (isUp) this.value -= this._scrollSize; else this.value += this._scrollSize; } onStageMouseUp(e) { ILaya.timer.clear(this, this.startLoop); ILaya.timer.clear(this, this.slide); } get skin() { return this._skin; } set skin(value) { if (value == " ") return; if (this._skin != value) { this._skin = value; if (this._skin && !Loader.getRes(this._skin)) { ILaya.loader.load([this._skin, this._skin.replace(".png", "$up.png"), this._skin.replace(".png", "$down.png"), this._skin.replace(".png", "$bar.png")], Handler.create(this, this._skinLoaded)); } else { this._skinLoaded(); } } } _skinLoaded() { if (this.destroyed) { return; } this.slider.skin = this._skin; this.callLater(this.changeScrollBar); this._sizeChanged(); this.event(Event.LOADED); } changeScrollBar() { this.upButton.visible = this._showButtons; this.downButton.visible = this._showButtons; if (this._showButtons) { this.upButton.skin = this._skin.replace(".png", "$up.png"); this.downButton.skin = this._skin.replace(".png", "$down.png"); } if (this.slider.isVertical) this.slider.y = this._showButtons ? this.upButton.height : 0; else this.slider.x = this._showButtons ? this.upButton.width : 0; this.resetPositions(); this.repaint(); } _sizeChanged() { super._sizeChanged(); this.repaint(); this.resetPositions(); this.event(Event.CHANGE); this.changeHandler && this.changeHandler.runWith(this.value); } resetPositions() { if (this.slider.isVertical) this.slider.height = this.height - (this._showButtons ? (this.upButton.height + this.downButton.height) : 0); else this.slider.width = this.width - (this._showButtons ? (this.upButton.width + this.downButton.width) : 0); this.resetButtonPosition(); } resetButtonPosition() { if (this.slider.isVertical) this.downButton.y = this.slider._y + this.slider.height; else this.downButton.x = this.slider._x + this.slider.width; } measureWidth() { if (this.slider.isVertical) return this.slider.width; return 100; } measureHeight() { if (this.slider.isVertical) return 100; return this.slider.height; } setScroll(min, max, value) { this.runCallLater(this._sizeChanged); this.slider.setSlider(min, max, value); this.slider.bar.visible = max > 0; if (!this._hide && this.autoHide) this.visible = false; } get max() { return this.slider.max; } set max(value) { this.slider.max = value; } get min() { return this.slider.min; } set min(value) { this.slider.min = value; } get value() { return this._value; } set value(v) { if (v !== this._value) { this._value = v; if (!this._isElastic) { if (this.slider["_value"] != v) { this.slider["_value"] = v; this.slider.changeValue(); } this._value = this.slider["_value"]; } this.event(Event.CHANGE); this.changeHandler && this.changeHandler.runWith(this._value); } } get isVertical() { return this.slider.isVertical; } set isVertical(value) { this.slider.isVertical = value; } get sizeGrid() { return this.slider.sizeGrid; } set sizeGrid(value) { this.slider.sizeGrid = value; } get scrollSize() { return this._scrollSize; } set scrollSize(value) { this._scrollSize = value; } set dataSource(value) { this._dataSource = value; if (typeof (value) == 'number' || typeof (value) == 'string') this.value = Number(value); else super.dataSource = value; } get dataSource() { return super.dataSource; } get thumbPercent() { return this._thumbPercent; } set thumbPercent(value) { this.runCallLater(this.changeScrollBar); this.runCallLater(this._sizeChanged); value = value >= 1 ? 0.99 : value; this._thumbPercent = value; if (this.scaleBar) { if (this.slider.isVertical) this.slider.bar.height = Math.max(this.slider.height * value, Styles.scrollBarMinNum); else this.slider.bar.width = Math.max(this.slider.width * value, Styles.scrollBarMinNum); } } get target() { return this._target; } set target(value) { if (this._target) { this._target.off(Event.MOUSE_WHEEL, this, this.onTargetMouseWheel); this._target.off(Event.MOUSE_DOWN, this, this.onTargetMouseDown); } this._target = value; if (value) { this._mouseWheelEnable && this._target.on(Event.MOUSE_WHEEL, this, this.onTargetMouseWheel); this._touchScrollEnable && this._target.on(Event.MOUSE_DOWN, this, this.onTargetMouseDown); } } get hide() { return this._hide; } set hide(value) { this._hide = value; this.visible = !value; } get showButtons() { return this._showButtons; } set showButtons(value) { this._showButtons = value; this.callLater(this.changeScrollBar); } get touchScrollEnable() { return this._touchScrollEnable; } set touchScrollEnable(value) { this._touchScrollEnable = value; this.target = this._target; } get mouseWheelEnable() { return this._mouseWheelEnable; } set mouseWheelEnable(value) { this._mouseWheelEnable = value; this.target = this._target; } onTargetMouseWheel(e) { this.value -= e.delta * this._scrollSize; this.target = this._target; } onTargetMouseDown(e) { if ((this.isLockedFun) && !this.isLockedFun(e)) return; this.event(Event.END); this._clickOnly = true; this._lastOffset = 0; this._checkElastic = false; this._lastPoint || (this._lastPoint = new Point()); this._lastPoint.setTo(ILaya.stage.mouseX, ILaya.stage.mouseY); ILaya.timer.clear(this, this.tweenMove); Tween.clearTween(this); ILaya.stage.once(Event.MOUSE_UP, this, this.onStageMouseUp2); ILaya.stage.once(Event.MOUSE_OUT, this, this.onStageMouseUp2); ILaya.timer.frameLoop(1, this, this.loop); } startDragForce() { this._clickOnly = true; this._lastOffset = 0; this._checkElastic = false; this._lastPoint || (this._lastPoint = new Point()); this._lastPoint.setTo(ILaya.stage.mouseX, ILaya.stage.mouseY); ILaya.timer.clear(this, this.tweenMove); Tween.clearTween(this); ILaya.stage.once(Event.MOUSE_UP, this, this.onStageMouseUp2); ILaya.stage.once(Event.MOUSE_OUT, this, this.onStageMouseUp2); ILaya.timer.frameLoop(1, this, this.loop); } cancelDragOp() { ILaya.stage.off(Event.MOUSE_UP, this, this.onStageMouseUp2); ILaya.stage.off(Event.MOUSE_OUT, this, this.onStageMouseUp2); ILaya.timer.clear(this, this.tweenMove); ILaya.timer.clear(this, this.loop); this._target.mouseEnabled = true; } checkTriggers(isTweenMove = false) { if (this.value >= 0 && this.value - this._lastOffset <= 0) { if ((this.triggerDownDragLimit) && this.triggerDownDragLimit(isTweenMove)) { this.cancelDragOp(); this.value = 0; return true; } } if (this.value <= this.max && (this.value - this._lastOffset >= this.max)) { if ((this.triggerUpDragLimit) && this.triggerUpDragLimit(isTweenMove)) { this.cancelDragOp(); this.value = this.max; return true; } } return false; } get lastOffset() { return this._lastOffset; } startTweenMoveForce(lastOffset) { this._lastOffset = lastOffset; ILaya.timer.frameLoop(1, this, this.tweenMove, [200]); } loop() { var mouseY = ILaya.stage.mouseY; var mouseX = ILaya.stage.mouseX; this._lastOffset = this.isVertical ? (mouseY - this._lastPoint.y) : (mouseX - this._lastPoint.x); if (this._clickOnly) { if (Math.abs(this._lastOffset * (this.isVertical ? ILaya.stage._canvasTransform.getScaleY() : ILaya.stage._canvasTransform.getScaleX())) > 1) { this._clickOnly = false; if (this.checkTriggers()) return; this._offsets || (this._offsets = []); this._offsets.length = 0; this._target.mouseEnabled = false; if (!this.hide && this.autoHide) { this.alpha = 1; this.visible = true; } this.event(Event.START); } else return; } else { if (this.checkTriggers()) return; } this._offsets.push(this._lastOffset); this._lastPoint.x = mouseX; this._lastPoint.y = mouseY; if (this._lastOffset === 0) return; if (!this._checkElastic) { if (this.elasticDistance > 0) { if (!this._checkElastic && this._lastOffset != 0) { if ((this._lastOffset > 0 && this._value <= this.min) || (this._lastOffset < 0 && this._value >= this.max)) { this._isElastic = true; this._checkElastic = true; } else { this._isElastic = false; } } } else { this._checkElastic = true; } } if (this._isElastic) { if (this._value <= this.min) { if (this._lastOffset > 0) { this.value -= this._lastOffset * Math.max(0, (1 - ((this.min - this._value) / this.elasticDistance))); } else { this.value -= this._lastOffset * 0.5; if (this._value >= this.min) this._checkElastic = false; } } else if (this._value >= this.max) { if (this._lastOffset < 0) { this.value -= this._lastOffset * Math.max(0, (1 - ((this._value - this.max) / this.elasticDistance))); } else { this.value -= this._lastOffset * 0.5; if (this._value <= this.max) this._checkElastic = false; } } } else { this.value -= this._lastOffset; } } onStageMouseUp2(e) { ILaya.stage.off(Event.MOUSE_UP, this, this.onStageMouseUp2); ILaya.stage.off(Event.MOUSE_OUT, this, this.onStageMouseUp2); ILaya.timer.clear(this, this.loop); if (this._clickOnly) { if (this._value >= this.min && this._value <= this.max) return; } this._target.mouseEnabled = true; if (this._isElastic) { if (this._value < this.min) { Tween.to(this, { value: this.min }, this.elasticBackTime, Ease.sineOut, Handler.create(this, this.elasticOver)); } else if (this._value > this.max) { Tween.to(this, { value: this.max }, this.elasticBackTime, Ease.sineOut, Handler.create(this, this.elasticOver)); } } else { if (!this._offsets) return; if (this._offsets.length < 1) { this._offsets[0] = this.isVertical ? ILaya.stage.mouseY - this._lastPoint.y : ILaya.stage.mouseX - this._lastPoint.x; } var offset = 0; var n = Math.min(this._offsets.length, 3); for (var i = 0; i < n; i++) { offset += this._offsets[this._offsets.length - 1 - i]; } this._lastOffset = offset / n; offset = Math.abs(this._lastOffset); if (offset < 2) { this.event(Event.END); return; } if (offset > 250) this._lastOffset = this._lastOffset > 0 ? 250 : -250; var dis = Math.round(Math.abs(this.elasticDistance * (this._lastOffset / 150))); ILaya.timer.frameLoop(1, this, this.tweenMove, [dis]); } } elasticOver() { this._isElastic = false; if (!this.hide && this.autoHide) { Tween.to(this, { alpha: 0 }, 500); } this.event(Event.END); } tweenMove(maxDistance) { this._lastOffset *= this.rollRatio; if (this.checkTriggers(true)) { return; } var tarSpeed; if (maxDistance > 0) { if (this._lastOffset > 0 && this.value <= this.min) { this._isElastic = true; tarSpeed = -(this.min - maxDistance - this.value) * 0.5; if (this._lastOffset > tarSpeed) this._lastOffset = tarSpeed; } else if (this._lastOffset < 0 && this.value >= this.max) { this._isElastic = true; tarSpeed = -(this.max + maxDistance - this.value) * 0.5; if (this._lastOffset < tarSpeed) this._lastOffset = tarSpeed; } } this.value -= this._lastOffset; if (Math.abs(this._lastOffset) < 0.1) { ILaya.timer.clear(this, this.tweenMove); if (this._isElastic) { if (this._value < this.min) { Tween.to(this, { value: this.min }, this.elasticBackTime, Ease.sineOut, Handler.create(this, this.elasticOver)); } else if (this._value > this.max) { Tween.to(this, { value: this.max }, this.elasticBackTime, Ease.sineOut, Handler.create(this, this.elasticOver)); } else { this.elasticOver(); } return; } this.event(Event.END); if (!this.hide && this.autoHide) { Tween.to(this, { alpha: 0 }, 500); } } } stopScroll() { this.onStageMouseUp2(null); ILaya.timer.clear(this, this.tweenMove); Tween.clearTween(this); } get tick() { return this.slider.tick; } set tick(value) { this.slider.tick = value; } }