Animation.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:10k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.lfx.Animation");
  9. dojo.require("dojo.lang.func");
  10. dojo.lfx.Line = function (start, end) {
  11. this.start = start;
  12. this.end = end;
  13. if (dojo.lang.isArray(start)) {
  14. var diff = [];
  15. dojo.lang.forEach(this.start, function (s, i) {
  16. diff[i] = this.end[i] - s;
  17. }, this);
  18. this.getValue = function (n) {
  19. var res = [];
  20. dojo.lang.forEach(this.start, function (s, i) {
  21. res[i] = (diff[i] * n) + s;
  22. }, this);
  23. return res;
  24. };
  25. } else {
  26. var diff = end - start;
  27. this.getValue = function (n) {
  28. return (diff * n) + this.start;
  29. };
  30. }
  31. };
  32. if ((dojo.render.html.khtml) && (!dojo.render.html.safari)) {
  33. dojo.lfx.easeDefault = function (n) {
  34. return (parseFloat("0.5") + ((Math.sin((n + parseFloat("1.5")) * Math.PI)) / 2));
  35. };
  36. } else {
  37. dojo.lfx.easeDefault = function (n) {
  38. return (0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2));
  39. };
  40. }
  41. dojo.lfx.easeIn = function (n) {
  42. return Math.pow(n, 3);
  43. };
  44. dojo.lfx.easeOut = function (n) {
  45. return (1 - Math.pow(1 - n, 3));
  46. };
  47. dojo.lfx.easeInOut = function (n) {
  48. return ((3 * Math.pow(n, 2)) - (2 * Math.pow(n, 3)));
  49. };
  50. dojo.lfx.IAnimation = function () {
  51. };
  52. dojo.lang.extend(dojo.lfx.IAnimation, {curve:null, duration:1000, easing:null, repeatCount:0, rate:10, handler:null, beforeBegin:null, onBegin:null, onAnimate:null, onEnd:null, onPlay:null, onPause:null, onStop:null, play:null, pause:null, stop:null, connect:function (evt, scope, newFunc) {
  53. if (!newFunc) {
  54. newFunc = scope;
  55. scope = this;
  56. }
  57. newFunc = dojo.lang.hitch(scope, newFunc);
  58. var oldFunc = this[evt] || function () {
  59. };
  60. this[evt] = function () {
  61. var ret = oldFunc.apply(this, arguments);
  62. newFunc.apply(this, arguments);
  63. return ret;
  64. };
  65. return this;
  66. }, fire:function (evt, args) {
  67. if (this[evt]) {
  68. this[evt].apply(this, (args || []));
  69. }
  70. return this;
  71. }, repeat:function (count) {
  72. this.repeatCount = count;
  73. return this;
  74. }, _active:false, _paused:false});
  75. dojo.lfx.Animation = function (handlers, duration, curve, easing, repeatCount, rate) {
  76. dojo.lfx.IAnimation.call(this);
  77. if (dojo.lang.isNumber(handlers) || (!handlers && duration.getValue)) {
  78. rate = repeatCount;
  79. repeatCount = easing;
  80. easing = curve;
  81. curve = duration;
  82. duration = handlers;
  83. handlers = null;
  84. } else {
  85. if (handlers.getValue || dojo.lang.isArray(handlers)) {
  86. rate = easing;
  87. repeatCount = curve;
  88. easing = duration;
  89. curve = handlers;
  90. duration = null;
  91. handlers = null;
  92. }
  93. }
  94. if (dojo.lang.isArray(curve)) {
  95. this.curve = new dojo.lfx.Line(curve[0], curve[1]);
  96. } else {
  97. this.curve = curve;
  98. }
  99. if (duration != null && duration > 0) {
  100. this.duration = duration;
  101. }
  102. if (repeatCount) {
  103. this.repeatCount = repeatCount;
  104. }
  105. if (rate) {
  106. this.rate = rate;
  107. }
  108. if (handlers) {
  109. dojo.lang.forEach(["handler", "beforeBegin", "onBegin", "onEnd", "onPlay", "onStop", "onAnimate"], function (item) {
  110. if (handlers[item]) {
  111. this.connect(item, handlers[item]);
  112. }
  113. }, this);
  114. }
  115. if (easing && dojo.lang.isFunction(easing)) {
  116. this.easing = easing;
  117. }
  118. };
  119. dojo.inherits(dojo.lfx.Animation, dojo.lfx.IAnimation);
  120. dojo.lang.extend(dojo.lfx.Animation, {_startTime:null, _endTime:null, _timer:null, _percent:0, _startRepeatCount:0, play:function (delay, gotoStart) {
  121. if (gotoStart) {
  122. clearTimeout(this._timer);
  123. this._active = false;
  124. this._paused = false;
  125. this._percent = 0;
  126. } else {
  127. if (this._active && !this._paused) {
  128. return this;
  129. }
  130. }
  131. this.fire("handler", ["beforeBegin"]);
  132. this.fire("beforeBegin");
  133. if (delay > 0) {
  134. setTimeout(dojo.lang.hitch(this, function () {
  135. this.play(null, gotoStart);
  136. }), delay);
  137. return this;
  138. }
  139. this._startTime = new Date().valueOf();
  140. if (this._paused) {
  141. this._startTime -= (this.duration * this._percent / 100);
  142. }
  143. this._endTime = this._startTime + this.duration;
  144. this._active = true;
  145. this._paused = false;
  146. var step = this._percent / 100;
  147. var value = this.curve.getValue(step);
  148. if (this._percent == 0) {
  149. if (!this._startRepeatCount) {
  150. this._startRepeatCount = this.repeatCount;
  151. }
  152. this.fire("handler", ["begin", value]);
  153. this.fire("onBegin", [value]);
  154. }
  155. this.fire("handler", ["play", value]);
  156. this.fire("onPlay", [value]);
  157. this._cycle();
  158. return this;
  159. }, pause:function () {
  160. clearTimeout(this._timer);
  161. if (!this._active) {
  162. return this;
  163. }
  164. this._paused = true;
  165. var value = this.curve.getValue(this._percent / 100);
  166. this.fire("handler", ["pause", value]);
  167. this.fire("onPause", [value]);
  168. return this;
  169. }, gotoPercent:function (pct, andPlay) {
  170. clearTimeout(this._timer);
  171. this._active = true;
  172. this._paused = true;
  173. this._percent = pct;
  174. if (andPlay) {
  175. this.play();
  176. }
  177. return this;
  178. }, stop:function (gotoEnd) {
  179. clearTimeout(this._timer);
  180. var step = this._percent / 100;
  181. if (gotoEnd) {
  182. step = 1;
  183. }
  184. var value = this.curve.getValue(step);
  185. this.fire("handler", ["stop", value]);
  186. this.fire("onStop", [value]);
  187. this._active = false;
  188. this._paused = false;
  189. return this;
  190. }, status:function () {
  191. if (this._active) {
  192. return this._paused ? "paused" : "playing";
  193. } else {
  194. return "stopped";
  195. }
  196. return this;
  197. }, _cycle:function () {
  198. clearTimeout(this._timer);
  199. if (this._active) {
  200. var curr = new Date().valueOf();
  201. var step = (curr - this._startTime) / (this._endTime - this._startTime);
  202. if (step >= 1) {
  203. step = 1;
  204. this._percent = 100;
  205. } else {
  206. this._percent = step * 100;
  207. }
  208. if ((this.easing) && (dojo.lang.isFunction(this.easing))) {
  209. step = this.easing(step);
  210. }
  211. var value = this.curve.getValue(step);
  212. this.fire("handler", ["animate", value]);
  213. this.fire("onAnimate", [value]);
  214. if (step < 1) {
  215. this._timer = setTimeout(dojo.lang.hitch(this, "_cycle"), this.rate);
  216. } else {
  217. this._active = false;
  218. this.fire("handler", ["end"]);
  219. this.fire("onEnd");
  220. if (this.repeatCount > 0) {
  221. this.repeatCount--;
  222. this.play(null, true);
  223. } else {
  224. if (this.repeatCount == -1) {
  225. this.play(null, true);
  226. } else {
  227. if (this._startRepeatCount) {
  228. this.repeatCount = this._startRepeatCount;
  229. this._startRepeatCount = 0;
  230. }
  231. }
  232. }
  233. }
  234. }
  235. return this;
  236. }});
  237. dojo.lfx.Combine = function (animations) {
  238. dojo.lfx.IAnimation.call(this);
  239. this._anims = [];
  240. this._animsEnded = 0;
  241. var anims = arguments;
  242. if (anims.length == 1 && (dojo.lang.isArray(anims[0]) || dojo.lang.isArrayLike(anims[0]))) {
  243. anims = anims[0];
  244. }
  245. dojo.lang.forEach(anims, function (anim) {
  246. this._anims.push(anim);
  247. anim.connect("onEnd", dojo.lang.hitch(this, "_onAnimsEnded"));
  248. }, this);
  249. };
  250. dojo.inherits(dojo.lfx.Combine, dojo.lfx.IAnimation);
  251. dojo.lang.extend(dojo.lfx.Combine, {_animsEnded:0, play:function (delay, gotoStart) {
  252. if (!this._anims.length) {
  253. return this;
  254. }
  255. this.fire("beforeBegin");
  256. if (delay > 0) {
  257. setTimeout(dojo.lang.hitch(this, function () {
  258. this.play(null, gotoStart);
  259. }), delay);
  260. return this;
  261. }
  262. if (gotoStart || this._anims[0].percent == 0) {
  263. this.fire("onBegin");
  264. }
  265. this.fire("onPlay");
  266. this._animsCall("play", null, gotoStart);
  267. return this;
  268. }, pause:function () {
  269. this.fire("onPause");
  270. this._animsCall("pause");
  271. return this;
  272. }, stop:function (gotoEnd) {
  273. this.fire("onStop");
  274. this._animsCall("stop", gotoEnd);
  275. return this;
  276. }, _onAnimsEnded:function () {
  277. this._animsEnded++;
  278. if (this._animsEnded >= this._anims.length) {
  279. this.fire("onEnd");
  280. }
  281. return this;
  282. }, _animsCall:function (funcName) {
  283. var args = [];
  284. if (arguments.length > 1) {
  285. for (var i = 1; i < arguments.length; i++) {
  286. args.push(arguments[i]);
  287. }
  288. }
  289. var _this = this;
  290. dojo.lang.forEach(this._anims, function (anim) {
  291. anim[funcName](args);
  292. }, _this);
  293. return this;
  294. }});
  295. dojo.lfx.Chain = function (animations) {
  296. dojo.lfx.IAnimation.call(this);
  297. this._anims = [];
  298. this._currAnim = -1;
  299. var anims = arguments;
  300. if (anims.length == 1 && (dojo.lang.isArray(anims[0]) || dojo.lang.isArrayLike(anims[0]))) {
  301. anims = anims[0];
  302. }
  303. var _this = this;
  304. dojo.lang.forEach(anims, function (anim, i, anims_arr) {
  305. this._anims.push(anim);
  306. if (i < anims_arr.length - 1) {
  307. anim.connect("onEnd", dojo.lang.hitch(this, "_playNext"));
  308. } else {
  309. anim.connect("onEnd", dojo.lang.hitch(this, function () {
  310. this.fire("onEnd");
  311. }));
  312. }
  313. }, this);
  314. };
  315. dojo.inherits(dojo.lfx.Chain, dojo.lfx.IAnimation);
  316. dojo.lang.extend(dojo.lfx.Chain, {_currAnim:-1, play:function (delay, gotoStart) {
  317. if (!this._anims.length) {
  318. return this;
  319. }
  320. if (gotoStart || !this._anims[this._currAnim]) {
  321. this._currAnim = 0;
  322. }
  323. var currentAnimation = this._anims[this._currAnim];
  324. this.fire("beforeBegin");
  325. if (delay > 0) {
  326. setTimeout(dojo.lang.hitch(this, function () {
  327. this.play(null, gotoStart);
  328. }), delay);
  329. return this;
  330. }
  331. if (currentAnimation) {
  332. if (this._currAnim == 0) {
  333. this.fire("handler", ["begin", this._currAnim]);
  334. this.fire("onBegin", [this._currAnim]);
  335. }
  336. this.fire("onPlay", [this._currAnim]);
  337. currentAnimation.play(null, gotoStart);
  338. }
  339. return this;
  340. }, pause:function () {
  341. if (this._anims[this._currAnim]) {
  342. this._anims[this._currAnim].pause();
  343. this.fire("onPause", [this._currAnim]);
  344. }
  345. return this;
  346. }, playPause:function () {
  347. if (this._anims.length == 0) {
  348. return this;
  349. }
  350. if (this._currAnim == -1) {
  351. this._currAnim = 0;
  352. }
  353. var currAnim = this._anims[this._currAnim];
  354. if (currAnim) {
  355. if (!currAnim._active || currAnim._paused) {
  356. this.play();
  357. } else {
  358. this.pause();
  359. }
  360. }
  361. return this;
  362. }, stop:function () {
  363. var currAnim = this._anims[this._currAnim];
  364. if (currAnim) {
  365. currAnim.stop();
  366. this.fire("onStop", [this._currAnim]);
  367. }
  368. return currAnim;
  369. }, _playNext:function () {
  370. if (this._currAnim == -1 || this._anims.length == 0) {
  371. return this;
  372. }
  373. this._currAnim++;
  374. if (this._anims[this._currAnim]) {
  375. this._anims[this._currAnim].play(null, true);
  376. }
  377. return this;
  378. }});
  379. dojo.lfx.combine = function (animations) {
  380. var anims = arguments;
  381. if (dojo.lang.isArray(arguments[0])) {
  382. anims = arguments[0];
  383. }
  384. if (anims.length == 1) {
  385. return anims[0];
  386. }
  387. return new dojo.lfx.Combine(anims);
  388. };
  389. dojo.lfx.chain = function (animations) {
  390. var anims = arguments;
  391. if (dojo.lang.isArray(arguments[0])) {
  392. anims = arguments[0];
  393. }
  394. if (anims.length == 1) {
  395. return anims[0];
  396. }
  397. return new dojo.lfx.Chain(anims);
  398. };