API Docs for: 1.10.1 最后更新日期:2016年03月28日
Google搜索   
Show:

File: events/LMouseEventContainer.js

  1. /** @language chinese
  2. * <p>LMouseEventContainer是一个鼠标事件监听器的容器,一般的鼠标事件监听需要遍历所有的可视对象,对程序消耗是比较大的,使用LMouseEventContainer后,鼠标监听对象变为只监听加载了鼠标事件的对象,可以大幅度提升鼠标事件监听的效率,但是,缺点是无法使用显示对象对鼠标事件进行遮挡。</p>
  3. * @class LMouseEventContainer
  4. * @constructor
  5. * @since 1.8.5
  6. * @example
  7. * LInit(50, "legend", 800, 480, main);
  8. * function main () {
  9. * LGlobal.setDebug(true);
  10. * LMouseEventContainer.set(LMouseEvent.MOUSE_DOWN,true);
  11. * var layer01 = new LSprite();
  12. * layer01.x = 50;
  13. * layer01.y = 20;
  14. * addChild(layer01);
  15. * var bmd = new LBitmapData("#FF0000", 0, 0, 100, 100);
  16. * var bm = new LBitmap(bmd);
  17. * layer01.addChild(bm);
  18. * layer01.addEventListener(LMouseEvent.MOUSE_DOWN, onmouse);
  19. * layer01.addEventListener(LMouseEvent.MOUSE_DOWN, onmouseOther);
  20. *
  21. * var layer02 = new LSprite();
  22. * layer02.graphics.drawRect(1,"#008800",[0,0,100,100],true);
  23. * layer02.x = 200;
  24. * layer02.y = 20;
  25. * addChild(layer02);
  26. * layer02.addEventListener(LMouseEvent.MOUSE_DOWN, onmouse);
  27. * layer02.addEventListener(LMouseEvent.MOUSE_DOWN, onmouseOther);
  28. * }
  29. * function onmouse(event){
  30. * trace("event.currentTarget : " + event.currentTarget + "(" + event.currentTarget.objectIndex + ")");
  31. * trace("event.target : " + event.target + "(" + event.target.objectIndex + ")");
  32. * trace("event.clickTarget == event.currentTarget : " + (event.clickTarget == event.currentTarget));
  33. * trace("event.offsetX : " + event.offsetX, "event.offsetY : " + event.offsetY);
  34. * trace("event.selfX : " + event.selfX, "event.selfY : " + event.selfY, "");
  35. * }
  36. * function onmouseOther(event,object){
  37. * trace("onmouseOther event.currentTarget : " + event.currentTarget + "(" + event.currentTarget.objectIndex + ")");
  38. * trace("onmouseOther object : " + object + "(" + object.objectIndex + ")");
  39. * trace("onmouseOther object == event.currentTarget : " + (object == event.currentTarget), "");
  40. * }
  41. * @examplelink <p><a href="../../../api/LMouseEventContainer/index.html" target="_blank">测试链接</a></p>
  42. * @public
  43. */
  44. var LMouseEventContainer = (function () {
  45. function MouseEventContainer(){
  46. var s = this;
  47. /** @language chinese
  48. * 设定是否触发所有范围内的鼠标事件,如果设定为false,则每次只触发最上层的一个鼠标事件。
  49. * @property dispatchAllEvent
  50. * @type Boolean
  51. * @default false
  52. * @since 1.8.5
  53. * @example
  54. * LInit(50, "legend", 800, 400, main);
  55. * var label;
  56. * function main(){
  57. * LGlobal.setDebug(true);
  58. * LMouseEventContainer.set(LMouseEvent.MOUSE_DOWN,true);
  59. * LMouseEventContainer.set(LMouseEvent.MOUSE_UP,true);
  60. * var backLayer = new LSprite();
  61. * backLayer.graphics.drawRect(1,"#000000",[0,0,LGlobal.width,LGlobal.height],true,"#cccccc");
  62. * addChild(backLayer);
  63. * label = new LTextField();
  64. * label.text = "LMouseEventContainer.dispatchAllEvent = false;";
  65. * label.size = 18;
  66. * label.x = 10;
  67. * label.y = 10;
  68. * backLayer.addChild(label);
  69. * var buttonChange = new LButtonSample1("Change dispatchAllEvent's value");
  70. * buttonChange.x = 10;
  71. * buttonChange.y = 40;
  72. * backLayer.addChild(buttonChange);
  73. * buttonChange.addEventListener(LMouseEvent.MOUSE_UP,dispatchAllEventChange);
  74. * var layer = new LSprite();
  75. * layer.name = "layer";
  76. * layer.y = 100;
  77. * layer.graphics.drawRect(2,"#ff0000",[0,0,500,200],true,"#880088");
  78. * backLayer.addChild(layer);
  79. * layer.addEventListener(LMouseEvent.MOUSE_DOWN,mousedown);
  80. * layer.addEventListener(LMouseEvent.MOUSE_UP,mouseup);
  81. * var button01 = new LButtonSample1("button01",50);
  82. * button01.name = "button01";
  83. * button01.x = 10;
  84. * button01.y = 10;
  85. * layer.addChild(button01);
  86. * button01.addEventListener(LMouseEvent.MOUSE_DOWN,mousedown);
  87. * button01.addEventListener(LMouseEvent.MOUSE_UP,mouseup);
  88. * var button02 = new LButtonSample1("button02");
  89. * button02.name = "button02";
  90. * button02.x = 15;
  91. * button02.y = 15;
  92. * layer.addChild(button02);
  93. * button02.addEventListener(LMouseEvent.MOUSE_DOWN,mousedown);
  94. * button02.addEventListener(LMouseEvent.MOUSE_UP,mouseup);
  95. * }
  96. * function dispatchAllEventChange(){
  97. * LMouseEventContainer.dispatchAllEvent = !LMouseEventContainer.dispatchAllEvent;
  98. * label.text = "LMouseEventContainer.dispatchAllEvent = "+LMouseEventContainer.dispatchAllEvent+";";
  99. * }
  100. * function mousedown(e){
  101. * trace("mousedown e.currentTarget.name = " + e.currentTarget.name);
  102. * }
  103. * function mouseup(e){
  104. * trace("mouseup e.currentTarget.name = " + e.currentTarget.name);
  105. * }
  106. * @examplelink <p><a href="../../../api/LMouseEventContainer/dispatchAllEvent.html" target="_blank">测试链接</a></p>
  107. * @public
  108. */
  109. s.container = {};
  110. s.dispatchAllEvent = false;
  111. s.mouseDownContainer = [];
  112. s.mouseUpContainer = [];
  113. s.mouseMoveContainer = [];
  114. s.mouseOverContainer = [];
  115. s.mouseOutContainer = [];
  116. s.mouseDblContainer = [];
  117. s.textFieldInputContainer = [];
  118. s.buttonContainer = [];
  119. };
  120. MouseEventContainer.prototype = {
  121. pushInputBox : function (d) {
  122. var s = this, c = s.textFieldInputContainer, i, l;
  123. for (i = 0, l = c.length; i < l; i++) {
  124. if (d.objectIndex == c[i].objectIndex) {
  125. return;
  126. }
  127. }
  128. s.textFieldInputContainer.push(d);
  129. },
  130. removeInputBox : function (d) {
  131. var s = this, c = s.textFieldInputContainer, i, l;
  132. for (i = 0, l = c.length; i < l; i++) {
  133. if (d.objectIndex == c[i].objectIndex) {
  134. s.textFieldInputContainer.splice(i, 1);
  135. break;
  136. }
  137. }
  138. },
  139. pushButton : function (d) {
  140. var s = this, c = s.buttonContainer, i, l;
  141. for (i = 0, l = c.length; i < l; i++) {
  142. if (d.objectIndex == c[i].objectIndex) {
  143. return;
  144. }
  145. }
  146. s.buttonContainer.push(d);
  147. },
  148. removeButton : function (d) {
  149. var s = this, c = s.buttonContainer, i, l;
  150. for (i = 0, l = c.length; i < l; i++) {
  151. if (d.objectIndex == c[i].objectIndex) {
  152. s.buttonContainer.splice(i, 1);
  153. break;
  154. }
  155. }
  156. },
  157. dispatchEventButton : function (e) {
  158. var s = this, c = s.buttonContainer, i, l;
  159. for (i = 0, l = c.length; i < l; i++) {
  160. if (typeof s.buttonContainer[i].ll_button_mode == "function") {
  161. s.buttonContainer[i].ll_button_mode(e);
  162. }
  163. }
  164. },
  165. addEvent : function (o, list, f) {
  166. var s = this;
  167. list.push({container : o, listener : f});
  168. },
  169. removeEvent : function (o, list, f) {
  170. var s = this, i, l;
  171. for (i = 0, l = list.length; i < l; i++) {
  172. if (list[i].container.objectIndex === o.objectIndex && (!f || list[i].listener == f)) {
  173. list.splice(i, 1);
  174. break;
  175. }
  176. }
  177. },
  178. addMouseDownEvent : function (o, f) {
  179. var s = this;
  180. s.addEvent(o, s.mouseDownContainer, f);
  181. },
  182. addMouseUpEvent : function (o, f) {
  183. var s = this;
  184. s.addEvent(o, s.mouseUpContainer, f);
  185. },
  186. addMouseMoveEvent : function (o, f) {
  187. var s = this;
  188. s.addEvent(o, s.mouseMoveContainer, f);
  189. },
  190. addMouseOverEvent : function (o, f) {
  191. var s = this;
  192. s.addEvent(o, s.mouseOverContainer, f);
  193. },
  194. addMouseOutEvent : function (o, f) {
  195. var s = this;
  196. s.addEvent(o, s.mouseOutContainer, f);
  197. },
  198. addMouseDblEvent : function (o, f) {
  199. var s = this;
  200. s.addEvent(o, s.mouseDblContainer, f);
  201. },
  202. addMouseEvent : function (o, t, f) {
  203. var s = this;
  204. if (t == LMouseEvent.MOUSE_DOWN) {
  205. s.addMouseDownEvent(o, f);
  206. } else if (t == LMouseEvent.MOUSE_UP) {
  207. s.addMouseUpEvent(o, f);
  208. } else if (t == LMouseEvent.MOUSE_OVER) {
  209. s.addMouseOverEvent(o, f);
  210. } else if (t == LMouseEvent.MOUSE_OUT) {
  211. s.addMouseOutEvent(o, f);
  212. } else if (t == LMouseEvent.MOUSE_MOVE) {
  213. s.addMouseMoveEvent(o, f);
  214. } else {
  215. s.addMouseDblEvent(o, f);
  216. }
  217. },
  218. hasEventListener : function(o, t, f){
  219. var s = this, list;
  220. if (t == LMouseEvent.MOUSE_DOWN) {
  221. list = s.mouseDownContainer;
  222. } else if (t == LMouseEvent.MOUSE_UP) {
  223. list = s.mouseUpContainer;
  224. } else if (t == LMouseEvent.MOUSE_OVER) {
  225. list = s.mouseOverContainer;
  226. } else if (t == LMouseEvent.MOUSE_OUT) {
  227. list = s.mouseOutContainer;
  228. } else if (t == LMouseEvent.MOUSE_MOVE) {
  229. list = s.mouseMoveContainer;
  230. } else {
  231. list = s.mouseDblContainer;
  232. }
  233. for (var i = 0, l = list.length; i < l; i++) {
  234. if (list[i].container.objectIndex === o.objectIndex && (!f || list[i].listener == f)) {
  235. return true;
  236. }
  237. }
  238. return false;
  239. },
  240. removeMouseDownEvent : function (o, f) {
  241. var s = this;
  242. s.removeEvent(o, s.mouseDownContainer, f);
  243. },
  244. removeMouseUpEvent : function (o, f) {
  245. var s = this;
  246. s.removeEvent(o, s.mouseUpContainer, f);
  247. },
  248. removeMouseMoveEvent : function (o, f) {
  249. var s = this;
  250. s.removeEvent(o, s.mouseMoveContainer, f);
  251. },
  252. removeMouseOverEvent : function (o, f) {
  253. var s = this;
  254. s.removeEvent(o, s.mouseOverContainer, f);
  255. },
  256. removeMouseOutEvent : function (o, f) {
  257. var s = this;
  258. s.removeEvent(o, s.mouseOutContainer, f);
  259. },
  260. removeMouseDblEvent : function (o, f) {
  261. var s = this;
  262. s.removeEvent(o, s.mouseDblContainer, f);
  263. },
  264. removeMouseEvent : function (o, t, f) {
  265. var s = this;
  266. if (t == LMouseEvent.MOUSE_DOWN) {
  267. s.removeMouseDownEvent(o, f);
  268. } else if (t == LMouseEvent.MOUSE_UP) {
  269. s.removeMouseUpEvent(o, f);
  270. } else if (t == LMouseEvent.MOUSE_OVER) {
  271. s.removeMouseOverEvent(o, f);
  272. } else if (t == LMouseEvent.MOUSE_OUT) {
  273. s.removeMouseOutEvent(o, f);
  274. } else if (t == LMouseEvent.MOUSE_MOVE) {
  275. s.removeMouseMoveEvent(o, f);
  276. } else {
  277. s.removeMouseDblEvent(o, f);
  278. }
  279. },
  280. dispatchMouseEvent : function (event, type) {
  281. var s = this;
  282. if (type == LMouseEvent.MOUSE_DOWN) {
  283. s.dispatchEvent(event, s.mouseDownContainer, LMouseEvent.MOUSE_DOWN);
  284. s.dispatchEvent(event, s.textFieldInputContainer);
  285. } else if (type == LMouseEvent.MOUSE_UP) {
  286. s.dispatchEvent(event, s.mouseUpContainer, LMouseEvent.MOUSE_UP);
  287. } else if (type == LMouseEvent.DOUBLE_CLICK) {
  288. s.dispatchEvent(event, s.mouseDblContainer, LMouseEvent.DOUBLE_CLICK);
  289. } else {
  290. s.dispatchEventButton(event);
  291. s.dispatchEvent(event, s.mouseOutContainer, LMouseEvent.MOUSE_OUT);
  292. s.dispatchEvent(event, s.mouseOverContainer, LMouseEvent.MOUSE_OVER);
  293. s.dispatchEvent(event, s.mouseMoveContainer, LMouseEvent.MOUSE_MOVE);
  294. }
  295. },
  296. getRootParams : function (s) {
  297. var p = s.parent, r = {x : 0, y : 0, scaleX : 1, scaleY : 1};
  298. while (p && p != "root") {
  299. r.x *= p.scaleX;
  300. r.y *= p.scaleY;
  301. r.x += p.x;
  302. r.y += p.y;
  303. r.scaleX *= p.scaleX;
  304. r.scaleY *= p.scaleY;
  305. p = p.parent;
  306. }
  307. return r;
  308. },
  309. _mouseEnabled : function (sp) {
  310. var self = this;
  311. if (!sp || !sp.parent) {
  312. return false;
  313. }
  314. if (!sp.visible || (typeof sp.mouseEnabled != UNDEFINED && !sp.mouseEnabled)) {
  315. return false;
  316. }
  317. var p = sp.parent;
  318. while (p && p != "root") {
  319. if (!p.mouseEnabled || !p.mouseChildren || !p.visible) {
  320. return false;
  321. }
  322. p = p.parent;
  323. if (!p) {
  324. return false;
  325. }
  326. }
  327. return true;
  328. },
  329. _dispatchEvent : function(event, type, st, index, fromIndex, endIndex) {
  330. var self = this, i, j, l = st.length;
  331. for (i = fromIndex; i <= endIndex && i < l; i++) {
  332. o = st[i];
  333. if (o.sp.objectIndex != index) {
  334. continue;
  335. }
  336. event.currentTarget = event.clickTarget = o.sp;
  337. if (!event.target) {
  338. event.target = o.sp;
  339. }
  340. event.event_type = type;
  341. event.selfX = (event.offsetX - o.co.x - o.sp.x) / (o.co.scaleX * o.sp.scaleX);
  342. event.selfY = (event.offsetY - o.co.y - o.sp.y) / (o.co.scaleY * o.sp.scaleY);
  343. o.listener(event, o.sp);
  344. }
  345. },
  346. dispatchEvent : function (event, list, type) {
  347. var self = this, sp, co, st = [], o, i, l;
  348. for (i = 0, l = list.length; i < l; i++) {
  349. sp = list[i].container || list[i];
  350. if (!self._mouseEnabled(sp)) {
  351. continue;
  352. }
  353. co = self.getRootParams(sp);
  354. if (!type && sp.mouseEvent) {
  355. sp.mouseEvent(event, LMouseEvent.MOUSE_DOWN, co);
  356. continue;
  357. }
  358. if (sp.ismouseon(event, co)) {
  359. if (type == LMouseEvent.MOUSE_OUT) {
  360. continue;
  361. }
  362. if (type == LMouseEvent.MOUSE_OVER) {
  363. if (sp.ll_mousein) {
  364. continue;
  365. }
  366. }
  367. if (type != LMouseEvent.MOUSE_UP) {
  368. sp.ll_mousein = true;
  369. }
  370. st.push({sp : sp, co : co, listener : list[i].listener});
  371. } else {
  372. if (type != LMouseEvent.MOUSE_OUT && type != LMouseEvent.MOUSE_OVER) {
  373. continue;
  374. }
  375. if (!sp.ll_mousein) {
  376. continue;
  377. }
  378. sp.ll_mousein = false;
  379. st.push({sp : sp, co : co, listener : list[i].listener});
  380. }
  381. }
  382. if (st.length == 0) {
  383. return;
  384. }
  385. if (st.length > 1) {
  386. st = st.sort(self._sort.bind(self));
  387. }
  388. l = st.length;
  389. for (i = 0; i < l; i++) {
  390. o = st[i];
  391. self._dispatchEvent(event, type, st, o.sp.objectIndex, i, self.dispatchAllEvent ? l - 1 : i);
  392. if (i < st.length - 1 && o.sp.objectIndex == st[i+1].sp.objectIndex){
  393. st.splice(i, 1);
  394. i--;
  395. continue;
  396. }
  397. var p;
  398. while (true) {
  399. if (!p) {
  400. p = o.sp.parent;
  401. event.target = o.sp;
  402. }
  403. if (!p || p == "root") {
  404. break;
  405. }
  406. self._dispatchEvent(event, type, st, p.objectIndex, i + 1, l);
  407. event.target = p;
  408. p = p.parent;
  409. if (!p || p == "root") {
  410. break;
  411. }
  412. }
  413. if (!self.dispatchAllEvent) {
  414. break;
  415. } else {
  416. continue;
  417. }
  418. }
  419. },
  420. /** @language chinese
  421. * 设定是否鼠标事件监听器的容器。
  422. * @method set
  423. * @param {String} type 事件的类型。
  424. * <p>可以设定的事件的类型有下面三种:</p>
  425. * <table>
  426. * <tr><th>事件的类型</th><th>值</th></tr>
  427. * <tr><td>LMouseEvent.MOUSE_DOWN</td><td>可以将LMouseEvent.MOUSE_DOWN放入鼠标事件监听器容器。</td></tr>
  428. * <tr><td>LMouseEvent.MOUSE_UP</td><td>可以将LMouseEvent.MOUSE_UP放入鼠标事件监听器容器。</td></tr>
  429. * <tr><td>LMouseEvent.MOUSE_MOVE</td><td>可以将LMouseEvent.MOUSE_MOVE,LMouseEvent.MOUSE_OVER,LMouseEvent.MOUSE_OUT放入鼠标事件监听器容器。</td></tr>
  430. * </table>
  431. * @param {Boolean} value 是否鼠标事件监听器的容器。
  432. * @example
  433. * LInit(1000/50,"legend",800,450,main);
  434. * var loader;
  435. * function main(){
  436. * LGlobal.setDebug(true);
  437. * loader = new LLoader();
  438. * loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
  439. * loader.load("lufylegend.js.png", "bitmapData");
  440. * }
  441. * function loadBitmapdata (event) {
  442. * trace(loader.objectIndex == event.target.objectIndex);//true
  443. * trace(event.target.content == event.currentTarget);//true
  444. * var bitmapdata = new LBitmapData(event.currentTarget);
  445. * var bitmap = new LBitmap(bitmapdata);
  446. * addChild(bitmap);
  447. * }
  448. * @examplelink <p><a href="../../../api/LMouseEventContainer/index.html" target="_blank">测试链接</a></p>
  449. * @public
  450. * @since 1.8.5
  451. */
  452. set : function (t, v) {
  453. this.container[t] = v;
  454. },
  455. _sort : function (a, b) {
  456. var s = this, o1, o2, al = s._getSort(a.sp), bl = s._getSort(b.sp), i, l1, l2;
  457. for (i = 0, l1 = al.length, l2 = bl.length; i < l1 && i < l2; i++) {
  458. o1 = al[i];
  459. o2 = bl[i];
  460. if (o1.objectIndex == o2.objectIndex) {
  461. continue;
  462. }
  463. return o2.parent.getChildIndex(o2) - o1.parent.getChildIndex(o1);
  464. }
  465. return bl.length - al.length;
  466. },
  467. _getSort : function (layer) {
  468. var p = layer.parent, list = [layer];
  469. while (p && p != "root") {
  470. list.unshift(p);
  471. p = p.parent;
  472. }
  473. return list;
  474. }
  475. };
  476. var container = new MouseEventContainer();
  477. container.set(LMouseEvent.MOUSE_DOWN,true);
  478. container.set(LMouseEvent.MOUSE_UP,true);
  479. container.set(LMouseEvent.MOUSE_MOVE,true);
  480. return container;
  481. })();