You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
4.7 KiB
141 lines
4.7 KiB
/************ GLOBAL VARS ***************/
|
|
let incrementStepsAnimation = 0.15;
|
|
let timeBetweenRedrawAnimationMS = 10;
|
|
|
|
/****************************************/
|
|
/************ CROSS SYMBOL **************/
|
|
/****************************************/
|
|
let crossProperties;
|
|
|
|
/* function that draws a Cross Symbol */
|
|
function drawCross(canvasElementId, size, canvasSize) {
|
|
// get canvas element from HTML
|
|
let canvas = document.getElementById(canvasElementId);
|
|
let c = canvas.getContext('2d');
|
|
// calculate some relative positions according to size:
|
|
// relativeSizeExclusions = 0...1 relative size of exclusions from the circle
|
|
// lineWidth = width of the stroke
|
|
let relativeSizeExclusions = 0.7; let lineWidth = 0.05*size;
|
|
// d = distance from canvas border
|
|
let d = lineWidth;
|
|
// clear canvas
|
|
c.clearRect(0,0,canvasSize,canvasSize);
|
|
|
|
// draw circle
|
|
c.lineWidth = lineWidth;
|
|
c.fillStyle = "red";
|
|
c.beginPath();
|
|
c.arc(canvasSize/2, canvasSize/2, size/2-d, 0, 2 * Math.PI, false);
|
|
c.stroke();
|
|
c.fill();
|
|
|
|
// draw exclusions
|
|
c.beginPath();
|
|
c.arc(canvasSize/2, canvasSize/2, relativeSizeExclusions*(size/2-d), 1.85 * Math.PI, 0.65 * Math.PI, false);
|
|
c.closePath();
|
|
c.fillStyle = "white";
|
|
c.lineWidth = lineWidth;
|
|
c.stroke();
|
|
c.fill();
|
|
c.beginPath();
|
|
c.arc(canvasSize/2, canvasSize/2, relativeSizeExclusions*(size/2-d), 1.65 * Math.PI, 0.85 * Math.PI, true);
|
|
c.closePath();
|
|
c.fillStyle = "white";
|
|
c.lineWidth = lineWidth;
|
|
c.stroke();
|
|
c.fill();
|
|
}
|
|
|
|
/* recurring function that draws the animation of the Cross Symbol */
|
|
function drawAnimatedCross() {
|
|
setTimeout(drawAnimatedCross, timeBetweenRedrawAnimationMS);
|
|
calculateNewSize(crossProperties);
|
|
drawCross(crossProperties.canvasElementId, crossProperties.currentSize, crossProperties.maxSize);
|
|
}
|
|
|
|
/* initiates an animation of the Cross Symbol */
|
|
function animateCross(canvasElementId, size, maxSize){
|
|
crossProperties = {
|
|
canvasElementId: canvasElementId,
|
|
minSize: size,
|
|
maxSize: maxSize,
|
|
currentSize: size,
|
|
growing: true
|
|
}
|
|
drawAnimatedCross();
|
|
}
|
|
|
|
/****************************************/
|
|
/********** CHECKMARK SYMBOL ***********/
|
|
/****************************************/
|
|
let checkmarkProperties;
|
|
|
|
/* function that draws a Checkmark Symbol */
|
|
function drawCheckmark(canvasElementId, size, canvasSize) {
|
|
// get canvas element from HTML
|
|
let canvas = document.getElementById(canvasElementId);
|
|
let c = canvas.getContext('2d');
|
|
// calculate some relative positions according to size:
|
|
// xPosKink = x position of kink of the checkmark
|
|
// yHeightHook = y position of highest point of the hook
|
|
// lineWidth = width of the stroke
|
|
let xPosKink = 0.25*size; let yHeightHook = 0.5*size; let lineWidth = 0.05*size;
|
|
// d = distance from canvas border
|
|
// t = thickness of checkmark
|
|
let d = (canvasSize-size)/2+lineWidth; let t = 0.2*size;
|
|
// clear canvas
|
|
c.clearRect(0,0,canvasSize,canvasSize);
|
|
|
|
// draw checkmark
|
|
c.lineWidth = lineWidth;
|
|
c.fillStyle = "green";
|
|
c.beginPath();
|
|
c.moveTo(xPosKink + d, canvasSize-d);
|
|
c.lineTo(canvasSize-d, d);
|
|
c.lineTo(canvasSize-d-t, d);
|
|
c.lineTo(xPosKink+d, canvasSize-d-t-lineWidth/2);
|
|
c.lineTo(d, yHeightHook+d-lineWidth/2);
|
|
c.lineTo(d, yHeightHook+d+t);
|
|
c.lineTo(xPosKink + d, canvasSize - d);
|
|
c.closePath();
|
|
c.stroke();
|
|
c.fill();
|
|
}
|
|
|
|
/* recurring function that draws the animation of the Checkmark Symbol */
|
|
function drawAnimatedCheckmark() {
|
|
setTimeout(drawAnimatedCheckmark, timeBetweenRedrawAnimationMS);
|
|
calculateNewSize(checkmarkProperties);
|
|
drawCheckmark(checkmarkProperties.canvasElementId, checkmarkProperties.currentSize, checkmarkProperties.maxSize);
|
|
}
|
|
|
|
/* initiates an animation of the Checkmark Symbol */
|
|
function animateCheckmark(canvasElementId, size, maxSize){
|
|
checkmarkProperties = {
|
|
canvasElementId: canvasElementId,
|
|
minSize: size,
|
|
maxSize: maxSize,
|
|
currentSize: maxSize,
|
|
growing: true
|
|
}
|
|
drawAnimatedCheckmark(); // start timed function
|
|
}
|
|
|
|
/****************************************/
|
|
/*************** HELPERS ***************/
|
|
/****************************************/
|
|
|
|
/* Function to calculate the new size of a canvas symbol. Requires object created in 'animateX' function. */
|
|
function calculateNewSize(symbol){
|
|
if(symbol.growing && symbol.currentSize < symbol.maxSize){
|
|
symbol.currentSize += incrementStepsAnimation;
|
|
}else if(symbol.growing && symbol.currentSize >= symbol.maxSize){
|
|
symbol.growing = false;
|
|
symbol.currentSize -= incrementStepsAnimation;
|
|
}else if(symbol.growing == false && symbol.currentSize > symbol.minSize){
|
|
symbol.currentSize -= incrementStepsAnimation;
|
|
}else if(symbol.growing == false && symbol.currentSize <= symbol.minSize){
|
|
symbol.growing = true;
|
|
symbol.currentSize += incrementStepsAnimation;
|
|
}
|
|
} |