From c02f70362916a6b19d0fe199e5950dd064d25abc Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 31 Jan 2020 13:14:39 -0800 Subject: [PATCH] Added constants to animation code. --- core/trashcan.js | 67 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/core/trashcan.js b/core/trashcan.js index fde748787..f2ee3bf41 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -154,6 +154,37 @@ Blockly.Trashcan.prototype.SPRITE_TOP_ = 32; */ Blockly.Trashcan.prototype.HAS_BLOCKS_LID_ANGLE = 0.1; +/** + * The length of the open/close animation in milliseconds. + * @type {number} + */ +Blockly.Trashcan.ANIMATION_LENGTH = 80; + +/** + * The number of frames in the animation. + * @type {number} + */ +Blockly.Trashcan.ANIMATION_FRAMES = 4; + +/** + * The minimum (resting) opacity of the trashcan and lid. + * @type {number} + */ +Blockly.Trashcan.OPACITY_MIN = 0.4; + +/** + * The maximum (hovered) opacity of the trashcan and lid. + * @type {number} + */ +Blockly.Trashcan.OPACITY_MAX = 0.8; + +/** + * The maximum angle the trashcan lid can opens to. At the end of the open + * animation the lid will be open to this angle. + * @type {number} + */ +Blockly.Trashcan.MAX_LID_ANGLE = 45; + /** * Current open/close state of the lid. * @type {boolean} @@ -389,14 +420,23 @@ Blockly.Trashcan.prototype.setOpen = function(state) { * @private */ Blockly.Trashcan.prototype.animateLid_ = function() { - this.lidOpen_ += this.isOpen ? 0.2 : -0.2; + var frames = Blockly.Trashcan.ANIMATION_FRAMES; + + var delta = 1 / (frames + 1); + this.lidOpen_ += this.isOpen ? delta : -delta; this.lidOpen_ = Math.min(Math.max(this.lidOpen_, this.minOpenness_), 1); - this.setLidAngle_(this.lidOpen_ * 45); - // Linear interpolation between 0.4 and 0.8. - var opacity = 0.4 + this.lidOpen_ * (0.8 - 0.4); + + this.setLidAngle_(this.lidOpen_ * Blockly.Trashcan.MAX_LID_ANGLE); + + var minOpacity = Blockly.Trashcan.OPACITY_MIN; + var maxOpacity = Blockly.Trashcan.OPACITY_MAX; + // Linear interpolation between min and max. + var opacity = minOpacity + this.lidOpen_ * (maxOpacity - minOpacity); this.svgGroup_.style.opacity = opacity; + if (this.lidOpen_ > this.minOpenness_ && this.lidOpen_ < 1) { - this.lidTask_ = setTimeout(this.animateLid_.bind(this), 20); + this.lidTask_ = setTimeout(this.animateLid_.bind(this), + Blockly.Trashcan.ANIMATION_LENGTH / frames); } }; @@ -414,6 +454,20 @@ Blockly.Trashcan.prototype.setLidAngle_ = function(lidAngle) { (this.LID_HEIGHT_ - 2) + ')'); }; +/** + * Sets the minimum openness of the trashcan lid. If the lid is currently + * closed, this will update lid's position. + * @param {number} newMin The new minimum openness of the lid. Should be between + * 0 and 1. + * @private + */ +Blockly.Trashcan.prototype.setMinOpenness_ = function(newMin) { + this.minOpenness_ = newMin; + if (!this.isOpen) { + this.setLidAngle_(newMin * Blockly.Trashcan.MAX_LID_ANGLE); + } +}; + /** * Flip the lid shut. * Called externally after a drag. @@ -479,8 +533,7 @@ Blockly.Trashcan.prototype.onDelete_ = function(event) { this.contents_.pop(); } - this.minOpenness_ = this.HAS_BLOCKS_LID_ANGLE; - this.setLidAngle_(this.minOpenness_ * 45); + this.setMinOpenness_(this.HAS_BLOCKS_LID_ANGLE); } };