- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一种工具,通过更新对象数组来执行动画序列。该数组将具有根据不同要求定制动画的所有参数。该工具是用 JavaScript 开发的,并利用 createJS 库和 TweenJS 来动画对象。对象是动态创建和定位的,然后应用补间。 Tween 似乎在我的代码中不起作用。
我有下面的完整代码
var AnimationFlow = (function () {
'use strict';
var AnimationFlow = function (canvasID) {
this.canvas = document.getElementById(canvasID);
this.stage = new createjs.Stage(this.canvas);
this.timeline = new createjs.Timeline();
this.tween = [];
this.preload;
this.animData;
this.manifest = [];
this.animObject = [];
this.stageObject = [];
this.loadProgressLabel;
this.loadingBarContainer;
this.loadingBar;
};
AnimationFlow.prototype.setData = function (data) {
this.animData = data;
this.manifest = [];
this.renderProgressBar();
for (var i = 0; i < this.animData.length; i++) {
this.manifest.push({'src': this.animData[i].targeturl, 'id': this.animData[i].targetID});
}
};
AnimationFlow.prototype.init = function () {
createjs.Ticker.addEventListener("tick", this.tick.bind(this));
createjs.Ticker.setFPS(30);
createjs.Ticker.useRAF = true;
this.preload = new createjs.LoadQueue(false);
this.preload.addEventListener("complete", this.handleComplete.bind(this));
this.preload.addEventListener("progress", this.handleProgress.bind(this));
this.preload.loadManifest(this.manifest);
this.stage.update();
};
AnimationFlow.prototype.handleProgress = function () {
this.loadingBar.scaleX = this.preload.progress * this.loadingBarWidth;
this.progresPrecentage = Math.round(this.preload.progress * 100);
this.loadProgressLabel.text = this.progresPrecentage + "% Loaded";
this.stage.update();
};
AnimationFlow.prototype.handleComplete = function () {
//Load images logic to be added
for (var i = 0; i < this.manifest.length; i++) {
this.animObject.push(this.preload.getResult(this.manifest[i].id));
}
this.loadProgressLabel.text = "Loading complete click to start";
this.stage.update();
this.canvas.addEventListener("click", this.handleClick.bind(this));
};
AnimationFlow.prototype.handleClick = function () {
this.start();
this.stage.removeChild(this.loadProgressLabel, this.loadingBarContainer);
this.canvas.removeEventListener("click", this.handleClick);
};
AnimationFlow.prototype.start = function () {
for (var i = 0; i < this.animObject.length; i++) {
this.obj = new createjs.Bitmap(this.animObject[i]);
this.obj.x = this.animData[i].initialXPos;
this.obj.y = this.animData[i].initialYPos;
this.obj.visible = this.animData[i].initialVisibility;
this.stage.addChild(this.obj);
this.stageObject.push(this.obj);
if(this.animData[i].isAnimatable){
var c = createjs.Tween.get(this.obj);
c.to({x:this.animData[i].params.xpos}, this.animData[i].duration);
c.call(this.tweenComplete);
this.timeline.addTween(c);
}
}
this.stage.update();
};
AnimationFlow.prototype.tick = function () {
console.log("heart beat on....");
this.stage.update();
};
AnimationFlow.prototype.tweenComplete = function () {
console.log("tweenComplete.......");
};
AnimationFlow.prototype.renderProgressBar = function () {
this.loadProgressLabel = new createjs.Text("", "18px Verdana", "black");
this.loadProgressLabel.lineWidth = 200;
this.loadProgressLabel.textAlign = "center";
this.loadProgressLabel.x = this.canvas.width / 2;
this.loadProgressLabel.y = 50;
this.stage.addChild(this.loadProgressLabel);
this.loadingBarContainer = new createjs.Container();
this.loadingBarHeight = 20;
this.loadingBarWidth = 300;
this.LoadingBarColor = createjs.Graphics.getRGB(0, 0, 0);
this.loadingBar = new createjs.Shape();
this.loadingBar.graphics.beginFill(this.LoadingBarColor).drawRect(0, 0, 1, this.loadingBarHeight).endFill();
this.frame = new createjs.Shape();
this.padding = 3;
this.frame.graphics.setStrokeStyle(1).beginStroke(this.LoadingBarColor).drawRect(-this.padding / 2, -this.padding / 2, this.loadingBarWidth + this.padding, this.loadingBarHeight + this.padding);
this.loadingBarContainer.addChild(this.loadingBar, this.frame);
this.loadingBarContainer.x = Math.round(this.canvas.width / 2 - this.loadingBarWidth / 2);
this.loadingBarContainer.y = 100;
this.stage.addChild(this.loadingBarContainer);
};
return AnimationFlow;
})();
var data = [{targetID: 'background', targeturl: 'assets/images/heliGame/sky.png',isAnimatable:true, duration: 2000, params: {xpos: '600'}, isVisibleAfterAnimation: true, isVisibleAtStartAnimation: true, initialVisibility: true, initialXPos: '0', initialYPos: '0'},
{targetID: 'mousePointer', targeturl: 'assets/images/heliGame/helicopter.png',isAnimatable:true, duration: 1000, params: {xpos: '500'}, isVisibleAfterAnimation: false, isVisibleAtStartAnimation: true, initialVisibility: true, initialXPos: '0', initialYPos: '0'}];
var buttons = ["playPauseBtn", "startFirstBtn", "reverseBtn"];
var animTool = new AnimationFlow('testCanvas');
animTool.setData(data);
animTool.init();
我在 JSFiddle 中有代码
最佳答案
有几个问题。首先,您需要将所有仓位定义为整数而不是字符串(即:从数据对象中的仓位数据中去掉引号)。其次,你需要调用: this.timeline.gotoAndPlay(0);开始时间线执行。否则动画将无法播放。这是一个固定版本:
var AnimationFlow = (function() {
'use strict';
var AnimationFlow = function(canvasID) {
this.canvas = document.getElementById(canvasID);
this.stage = new createjs.Stage(this.canvas);
this.timeline = new createjs.Timeline();
this.tween = [];
this.preload;
this.animData;
this.manifest = [];
this.animObject = [];
this.stageObject = [];
this.loadProgressLabel;
this.loadingBarContainer;
this.loadingBar;
};
AnimationFlow.prototype.setData = function(data) {
this.animData = data;
this.manifest = [];
this.renderProgressBar();
for (var i = 0; i < this.animData.length; i++) {
this.manifest.push({
'src': this.animData[i].targeturl,
'id': this.animData[i].targetID
});
}
};
AnimationFlow.prototype.init = function() {
createjs.Ticker.addEventListener("tick", this.tick.bind(this));
createjs.Ticker.setFPS(30);
createjs.Ticker.useRAF = true;
this.preload = new createjs.LoadQueue(false);
this.preload.addEventListener("complete", this.handleComplete.bind(this));
this.preload.addEventListener("progress", this.handleProgress.bind(this));
this.preload.loadManifest(this.manifest);
this.stage.update();
};
AnimationFlow.prototype.handleProgress = function() {
this.loadingBar.scaleX = this.preload.progress * this.loadingBarWidth;
this.progresPrecentage = Math.round(this.preload.progress * 100);
this.loadProgressLabel.text = this.progresPrecentage + "% Loaded";
this.stage.update();
};
AnimationFlow.prototype.handleComplete = function() {
//Load images logic to be added
for (var i = 0; i < this.manifest.length; i++) {
this.animObject.push(this.preload.getResult(this.manifest[i].id));
}
this.loadProgressLabel.text = "Loading complete click to start";
this.stage.update();
this.canvas.addEventListener("click", this.handleClick.bind(this));
};
AnimationFlow.prototype.handleClick = function() {
this.start();
this.stage.removeChild(this.loadProgressLabel, this.loadingBarContainer);
this.canvas.removeEventListener("click", this.handleClick);
};
AnimationFlow.prototype.start = function() {
for (var i = 0; i < this.animObject.length; i++) {
this.obj = new createjs.Bitmap(this.animObject[i]);
this.obj.x = this.animData[i].initialXPos;
this.obj.y = this.animData[i].initialYPos;
this.obj.visible = this.animData[i].initialVisibility;
this.stage.addChild(this.obj);
this.stageObject.push(this.obj);
if (this.animData[i].isAnimatable) {
console.log("animatable:" + this.animData[i].params.xpos + " " + this.animData[i].duration);
var c = createjs.Tween.get(this.obj);
c.to({
x: this.animData[i].params.xpos
}, this.animData[i].duration);
c.call(this.tweenComplete);
this.timeline.addTween(c);
}
}
this.timeline.gotoAndPlay(0);
this.stage.update();
};
AnimationFlow.prototype.tick = function() {
this.stage.update();
};
AnimationFlow.prototype.tweenComplete = function() {
console.log("tweenComplete.......");
};
AnimationFlow.prototype.renderProgressBar = function() {
this.loadProgressLabel = new createjs.Text("", "18px Verdana", "black");
this.loadProgressLabel.lineWidth = 200;
this.loadProgressLabel.textAlign = "center";
this.loadProgressLabel.x = this.canvas.width / 2;
this.loadProgressLabel.y = 50;
this.stage.addChild(this.loadProgressLabel);
this.loadingBarContainer = new createjs.Container();
this.loadingBarHeight = 20;
this.loadingBarWidth = 300;
this.LoadingBarColor = createjs.Graphics.getRGB(0, 0, 0);
this.loadingBar = new createjs.Shape();
this.loadingBar.graphics.beginFill(this.LoadingBarColor).drawRect(0, 0, 1, this.loadingBarHeight).endFill();
this.frame = new createjs.Shape();
this.padding = 3;
this.frame.graphics.setStrokeStyle(1).beginStroke(this.LoadingBarColor).drawRect(-this.padding / 2, -this.padding / 2, this.loadingBarWidth + this.padding, this.loadingBarHeight + this.padding);
this.loadingBarContainer.addChild(this.loadingBar, this.frame);
this.loadingBarContainer.x = Math.round(this.canvas.width / 2 - this.loadingBarWidth / 2);
this.loadingBarContainer.y = 100;
this.stage.addChild(this.loadingBarContainer);
};
return AnimationFlow;
})();
var data = [{
targetID: 'background',
targeturl: 'https://s13.postimg.org/tyj4iop93/Sky_Pic.jpg',
isAnimatable: true,
duration: 2000,
params: {
xpos: -100
},
isVisibleAfterAnimation: true,
isVisibleAtStartAnimation: true,
initialVisibility: true,
initialXPos: 0,
initialYPos: 0
}, {
targetID: 'mousePointer',
targeturl: 'http://jamesshaji.com/angular/assets/images/heliGame/helicopter.png',
isAnimatable: true,
duration: 2000,
params: {
xpos: 100
},
isVisibleAfterAnimation: false,
isVisibleAtStartAnimation: true,
initialVisibility: true,
initialXPos: 450,
initialYPos: 50
}];
var buttons = ["playPauseBtn", "startFirstBtn", "reverseBtn"];
var animTool = new AnimationFlow('testCanvas');
animTool.setData(data);
animTool.init();
<script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tweenjs/0.6.2/tweenjs.min.js"></script>
<div>Animation</div>
<canvas height="500" width="500" id="testCanvas">
</canvas>
关于javascript - TweenJS 动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43016650/
我正在尝试用 TweenJS 做一些非常简单的事情,在使用 GSAP 后,我发现它不太直观。只是想用 CSS/HTML 补间 div - 已经设置为包含图像: function init() {
我希望你们中的一些人使用过 tween.js(create.js 库套件的一部分)。 我有一个 JS Fiddle 来向您展示我的问题:http://jsfiddle.net/qyp8Y/1/ 我在每
情况 我需要循环遍历一个数组,并根据每个项目的值运行补间。因此,对于数组中的每个项目,必须有一个单独的 Tween 实例。根据TweenJS documentation ,get() 方法“返回一个新
我已经在这个问题上坚持了大约一周,无法弄清楚为什么容器内的形状实例在以 60 fps 的速度制作动画时变得模糊。我的容器包含一个形状实例。形状实例与一个图形实例相关联。似乎有一个白色的模糊物追随着动画
我正在尝试以圆形路径旋转一只鸟,但问题是 to 方法没有提供太多控制来做确切的事情,我正在尝试将鸟头向上移动或向下旋转。 这是我的 fiddle http://jsfiddle.net/HF765/1
我的第一个 Stackoverflow 问题。补间似乎运行了,因为它在最后调用了暴力函数。但是,没有补间发生。 window.onload=init(); function init() {
我正在尝试在名为 TweenJs(CreateJs 套件的一部分)的 JavaScript 库中的“单击”事件上创建简单的动画,但似乎动画仅在我第一次单击矩形时更新显示。动画第一次结束后,每次单击时,
我正在使用tweenJS为了使我的页面中的一些图像具有动画效果。我正在创建这样的补间: star = new createjs.Bitmap(starPic.src); stage.addChild(
我在为 x=0 到 x=400 的图像设置动画时遇到了问题。我正在使用 easeljs 和 tweenjs。这是我的代码:Javascript:
我正在开发一种工具,通过更新对象数组来执行动画序列。该数组将具有根据不同要求定制动画的所有参数。该工具是用 JavaScript 开发的,并利用 createJS 库和 TweenJS 来动画对象。对
我想使用 tween.js 为多个屏幕对象设置动画。 这些对象被组织在一个数组中,我想将每个单独的元素传递给补间函数,该函数大致如下:http://jsfiddle.net/8L9Dz/ var ta
我遇到的问题是这样的: 我想让位图移动到一些点,这些点存储在一个数组中。我如何使用 tweenJS 来获得这个? 我尝试的第一种方法是这样的: var points = [{x:0, y:0}, {x
我有一个例子,我想用easel.js位图创建动画,但它似乎不起作用。在这个项目中,我使用preload.js来加载图像;卡中裁剪卡图片;创建 Bitmap 对象并尝试使用 tween.js 为该位图设
我正在使用 eaeljs 和 tweenjs 来制作多条线的动画,这些线通过一个点从一个位置绘制到另一个位置,使其成为一条曲线,并在该线的前面附加了一个 img。我为此使用补间插件 MotionGui
在此示例中,预期结果是使圆圈淡出然后淡入。这与链接一起工作正常。代码片段中的注释行 createjs.Tween.get(circle).wait(0).to({alpha:0.1},2000).wa
我最近切换到 EaselJs 并想为圆圈的颜色设置动画。 到目前为止我得到的代码是这样的: var shape = new createjs.Shape(); shape.graphics.begin
我正在尝试使用 TweenJs 设计一个简单的动画..让我们考虑两个人玩 throw 球。我设法使球沿直线移动。但它必须看起来很现实。球应该像重力一样沿着弯曲的路径移动。我如何在路径中定义“检查点”?
我在 CreateJS/TweenJS 中有多个 Tweens: createjs.Tween.get(elem1).to({..}); createjs.Tween.get(elem2).to({.
我对 createJS 还很陌生 - 我想实现像倒计时器动画一样的效果: 我偶然发现了这个issue其中有这个fiddle - 我想实现这样的效果,但我想创建一个弧形: 我尝试调整代码并更改点值,但它
有人告诉我补间对象中的 .to() 方法将图形对象移动到 Canvas 上的精确点。但是,当我运行下面的代码时,.to() 方法将 400 像素添加到圆的原始 x 位置,即 165。因此,圆将变为 5
我是一名优秀的程序员,十分优秀!