canvasベース・エントリー・インスタンス
8548 ワード
核心思想.
現在のフレームを更新し続けることで、アニメーション効果が得られます.
canvasラベル
canvasはhtml 5のラベルで、2つの属性widthとheightがあり、jsで呼び出されるときは一般的に
canvasについて
canvasのすべてのレンダリング動作はjavascriptに基づいています.つまり、対応するjavascriptを書くだけで効果が得られます.静的な基本形状、文字、画像を描くときは簡単ですが、canvasには使用する必要はありません.canvasが本当に夢中になっているのは、そのダイナミック効果canvasのダイナミック効果が非常に不思議であり、javascriptに基づいて単一の要素を操作するので、再配置を考慮する必要はなく、再描画自体だけでよく、効率的にはcss 3などよりはるかに高い
canvasアニメーションの原理
アニメーションはマルチフレームの静的ピクチャを切り替えて人の目をだますことで完成し、canvas自体はキャンバスであるため、javascriptでは自分の望むアニメーションを書くことでアニメーション効果を完成させることができる基本的な核心は、現在のフレームを絶えず再描画することである.
簡単なアニメーションを完成するにはアニメーションを記述するオブジェクト
ここでまず1つの円のコンストラクション関数を定義し、座標の生成、オフセット速度など、必要な円の属性を宣言します.この例では複数の円をレンダリングする必要があるため、円のオブジェクトをロードするために配列を書くのは簡単ですが、ここは複雑なアニメーションの始まりであり、複雑なアニメーションほど必要なパラメータが多くなります.この方面は自分で書くことができて、完全に宣言することができて、定義することができます.静的オブジェクトをcanvasに入れる、すなわち、第1フレーム を描画する.
ここであなたの円をすべてcanvasに入れて、カプセル化されたランダム関数を使っています.実際にはjavascriptを使うので、他の初期化方法もカスタマイズできます.アニメーション効果
ここでは次のフレームを描く方法です.ここでは主に前のフレームの円の座標を少しずらして再レンダリングします.レンダリング速度が十分な場合、アニメーション効果を簡単に達成できます.ユーザインタラクション
ここでイベントをバインドすればいい
ふろく
index.html
canvas_circle.js
canvas_tool.js
現在のフレームを更新し続けることで、アニメーション効果が得られます.
canvasラベル
canvasはhtml 5のラベルで、2つの属性widthとheightがあり、jsで呼び出されるときは一般的に
document.getElementById('canvas').width
を使用して取得または設定されます.canvasについて
canvasのすべてのレンダリング動作はjavascriptに基づいています.つまり、対応するjavascriptを書くだけで効果が得られます.静的な基本形状、文字、画像を描くときは簡単ですが、canvasには使用する必要はありません.canvasが本当に夢中になっているのは、そのダイナミック効果canvasのダイナミック効果が非常に不思議であり、javascriptに基づいて単一の要素を操作するので、再配置を考慮する必要はなく、再描画自体だけでよく、効率的にはcss 3などよりはるかに高い
canvasアニメーションの原理
アニメーションはマルチフレームの静的ピクチャを切り替えて人の目をだますことで完成し、canvas自体はキャンバスであるため、javascriptでは自分の望むアニメーションを書くことでアニメーション効果を完成させることができる基本的な核心は、現在のフレームを絶えず再描画することである.
簡単なアニメーションを完成するには
/**
*
* @param {boolean} animated
* @param {number} x x
* @param {number} y y
* @param {number} vx x
* @param {number} vy y
* @param {number} radius
* @param {array} color
* @param {number} time
*/
function Circle(x, y, vx, vy, radius, color, time){
this.animated = true
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.radius = radius;
this.time = time;
this.color = ['LightPink', 'PaleVioletRed', 'DeepPink', 'MediumVioletRed',
'Magenta', 'DarkVoilet', 'SlateBlue','Navy',
'RoyalBlue', 'DarkSlateGray', 'Auqamarin', 'MintCream',
'Olive', 'Gold','Tomato', 'Red'];
this.globalAlpha = 1;//
this.vglobalAlpha = 0.02;//
}
/**
* @param {number} x x
* @param {number} y y
* @return {array}
*/
Circle.prototype.create = function(x, y) {
iscreate = false;
var _this = this;
var n = _this.random(20, 30);//
var circles = [];//
for(var i=0; i
ここでまず1つの円のコンストラクション関数を定義し、座標の生成、オフセット速度など、必要な円の属性を宣言します.この例では複数の円をレンダリングする必要があるため、円のオブジェクトをロードするために配列を書くのは簡単ですが、ここは複雑なアニメーションの始まりであり、複雑なアニメーションほど必要なパラメータが多くなります.この方面は自分で書くことができて、完全に宣言することができて、定義することができます.
/**
*
* @param {array} circles
*/
Circle.prototype.draw = function(circles, n){
var _this = this;
for(var i=0; i
ここであなたの円をすべてcanvasに入れて、カプセル化されたランダム関数を使っています.実際にはjavascriptを使うので、他の初期化方法もカスタマイズできます.
/**
*
* @param {array} circles
*/
Circle.prototype.animate = function( circles ) {
var _this = this;
window.cancelAnimationFrame(timer);
timer = window.requestAnimationFrame(function(){
_this.clearCanvas();
for(var i=0; i
ここでは次のフレームを描く方法です.ここでは主に前のフレームの円の座標を少しずらして再レンダリングします.レンダリング速度が十分な場合、アニメーション効果を簡単に達成できます.
//canvas
function mousedown(event) {
var ex = event.point.x;//
var ey = event.point.y;//
window.cancelAnimationFrame(timer);
c.create(ex, ey);
}
ここでイベントをバインドすればいい
ふろく
index.html
canvas_circle.js
//canvas_circle.js
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var timer;//
/**
*
* @param {boolean} animated
* @param {number} x x
* @param {number} y y
* @param {number} vx x
* @param {number} vy y
* @param {number} radius
* @param {array} color
* @param {number} time
*/
function Circle(x, y, vx, vy, radius, color, time){
this.animated = true
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.radius = radius;
this.time = time;
this.color = ['LightPink', 'PaleVioletRed', 'DeepPink', 'MediumVioletRed',
'Magenta', 'DarkVoilet', 'SlateBlue','Navy',
'RoyalBlue', 'DarkSlateGray', 'Auqamarin', 'MintCream',
'Olive', 'Gold','Tomato', 'Red'];
this.fps = 60;//
this.globalAlpha = 1;//
this.vglobalAlpha = 0.02;//
}
/**
*
* @param {number} min
* @param {number} max
* @return {number}
*/
Circle.prototype.random = function( min, max ){
return Math.random() * (max - min) + min;
}
//
Circle.prototype.init = function() {
this.render();
//this.draw();
}
// canvas
Circle.prototype.render = function() {
canvas.width = window.innerWidth - 1;
canvas.height = window.innerHeight - 1;
}
/**
* @param {number} x x
* @param {number} y y
* @return {array}
*/
Circle.prototype.create = function(x, y) {
iscreate = false;
var _this = this;
var n = _this.random(20, 30);//
var circles = [];//
for(var i=0; i
canvas_tool.js
//canvas_tool.js
window.tool = {};
window.tool.captureMT = function(element, touchStartEvent, touchMoveEvent, touchEndEvent) {
'use strict';
var isTouch = ('ontouchend' in document);
var touchstart = null;
var touchmove = null
var touchend = null;
if(isTouch){
touchstart = 'touchstart';
touchmove = 'touchmove';
touchend = 'touchend';
}else{
touchstart = 'mousedown';
touchmove = 'mousemove';
touchend = 'mouseup';
};
/* Event */
function getPoint(event) {
/* , element */ event = event || window.event;
var touchEvent = isTouch ? event.changedTouches[0]:event;
var x = (touchEvent.pageX || touchEvent.clientX + document.body.scrollLeft + document.documentElement.scrollLeft);
x -= element.offsetLeft;
var y = (touchEvent.pageY || touchEvent.clientY + document.body.scrollTop + document.documentElement.scrollTop);
y -= element.offsetTop;
return {x: x,y: y};
};
if(!element) return;
/* element touchstart */
element.addEventListener(touchstart, function(event) {
event.point = getPoint(event);
touchStartEvent && touchStartEvent.call(this, event);
}, false);
/* element touchmove */
element.addEventListener(touchmove, function(event) {
event.point = getPoint(event);
touchMoveEvent && touchMoveEvent.call(this, event);
}, false);
/* element touchend */
element.addEventListener(touchend, function(event) {
event.point = getPoint(event);
touchEndEvent && touchEndEvent.call(this, event);
}, false);
};