leaflet.LayerOpacity.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /**
  2. * 图层透明度改变模块
  3. * Date: 13-5-23
  4. * Time: 下午12:06
  5. * Author:Song.Huang
  6. */
  7. L.Control.LayerOpacity = L.Control.extend({
  8. options:{
  9. position:'bottomcenter',
  10. autoZIndex:true,
  11. timeOut:null
  12. },
  13. _mapZoomScope:{},
  14. initialize:function(layerObj,options){
  15. var _this = this;
  16. this._layer = layerObj;
  17. L.setOptions(this,options);
  18. },
  19. onAdd:function(map){
  20. this._mainMap = map;
  21. this._mapZoomScope.minZoom = this._mainMap.getMinZoom();
  22. this._mapZoomScope.maxZoom = this._mainMap.getMaxZoom();
  23. //this._mainMap.setZoomScope(this.options.min_zoom,this.options.max_zoom);
  24. this._mainMap.fire('singleLayer:addToMap',this._layer);
  25. this._createControl();
  26. return this._container;
  27. },
  28. /**
  29. * 面板移除事件
  30. */
  31. onRemove:function(){
  32. var _this = this;
  33. this._mainMap.setZoomScope(this._mapZoomScope.minZoom,this._mapZoomScope.maxZoom);
  34. _this._mainMap.off('click dragstart zoomend',_this._changeState,this);
  35. _this._mainMap.fire("layerOpacity:remove",this);
  36. _this._mainMap.off('click dragstart zoomend',_this._changeState,this);
  37. L.DomEvent.off(_this._draggerContainer, 'click', this._onSliderClick, this);
  38. L.DomEvent.off(_this._dragger, 'mousedown', this._onSliderMove, this);
  39. if(_this.options.showFavBtn){
  40. L.DomEvent.off(_this._favBtn,'click',this._favOverLayer,this);
  41. }
  42. if(!_this.options.onlyShow){
  43. L.DomEvent.off(_this._closeBtn,'click',this._hideOverLayer,this);
  44. }
  45. L.DomEvent.off(_this._container,'mousemove',this._changeState,this);
  46. L.DomEvent.off(_this._dragger, 'touchmove', function(e){
  47. _this._changeOpacity(_this._updateDraggerPosition(e.touches[0]));
  48. });
  49. },
  50. /**
  51. * 创建控件
  52. * @returns {*}
  53. * @private
  54. */
  55. _createControl:function(){
  56. var _this = this;
  57. _this._container = L.DomUtil.create('div','leaflet-control-layerOpacity'+(_this.options.onlyShow?' only-show':''));
  58. _this._titleLabel = L.DomUtil.create('span','title-label',_this._container);
  59. _this._titleLabel.innerHTML = "透明度:";
  60. _this._numMaxLabel = L.DomUtil.create('span','numMax-label',_this._container);
  61. _this._numMaxLabel.innerHTML = "100";
  62. _this._draggerContainer = L.DomUtil.create('div','dragger-container',_this._container);
  63. _this._draggerBg = L.DomUtil.create('div','dragger-bg',_this._draggerContainer);
  64. _this._dragger = L.DomUtil.create('div','dragger',_this._draggerContainer);
  65. _this._opacityNum = L.DomUtil.create('div','opacity-num',_this._draggerContainer);
  66. _this._opacityNum.innerHTML = '100%';
  67. _this._numMinLabel = L.DomUtil.create('span','numMin-label',_this._container);
  68. _this._numMinLabel.innerHTML = "0";
  69. if(_this.options.showFavBtn || !_this.options.onlyShow){
  70. _this._optionsWrap = L.DomUtil.create('div','options-wrap',_this._container);
  71. }
  72. if(_this.options.atlas){
  73. _this._infoBtn = L.DomUtil.create('a','info_Btn',_this._optionsWrap);
  74. _this._infoBtn.title = '详情';
  75. _this._infoBtn.innerHTML = '详情';
  76. if(_this.options.showFavBtn){
  77. _this._optionsWrap.style.right = '-80px';
  78. }else{
  79. _this._optionsWrap.style.right = '-54px';
  80. }
  81. L.DomEvent.on(_this._infoBtn,'click',this._getShowInfo,this);
  82. }
  83. if(_this.options.showFavBtn){
  84. _this._favBtn = L.DomUtil.create('a','fav_abtn',_this._optionsWrap);
  85. _this._favBtn.title = '收藏';
  86. _this._favBtn.innerHTML = '收藏';
  87. //_this._optionsWrap.style.right = '-54px';
  88. L.DomEvent.on(_this._favBtn,'click',this._favOverLayer,this);
  89. }
  90. if(!_this.options.onlyShow){
  91. _this._closeBtn = L.DomUtil.create('a','close_abtn',_this._optionsWrap);
  92. _this._closeBtn.title = '关闭';
  93. _this._closeBtn.innerHTML = '关闭';
  94. L.DomEvent.on(_this._closeBtn,'click',this._hideOverLayer,this);
  95. }
  96. L.DomEvent
  97. .on(_this._container,'click', L.DomEvent.stopPropagation)
  98. .on(_this._container,'click', L.DomEvent.preventDefault)
  99. .on(_this._container, 'contextmenu', L.DomEvent.stopPropagation);
  100. _this._container.onselectstart=function(){
  101. return false;
  102. };
  103. _this._mainMap.on('click dragstart zoomend',_this._changeState,this);
  104. L.DomEvent.disableClickPropagation(this._container);
  105. L.DomEvent.on(_this._draggerContainer, 'click', this._onSliderClick, this);
  106. L.DomEvent.on(_this._dragger, 'mousedown', this._onSliderMove, this);
  107. L.DomEvent.on(_this._container,'mousemove',this._changeState,this);
  108. L.DomEvent.on(_this._dragger, 'touchmove', function(e){
  109. _this._changeOpacity(_this._updateDraggerPosition(e.touches[0]));
  110. });
  111. return _this._container;
  112. },
  113. /**
  114. * 点击改变进度条
  115. * @param e
  116. * @private
  117. */
  118. _onSliderClick: function (e) {
  119. var _this = this;
  120. var first = (e.touches && e.touches.length === 1 ? e.touches[0] : e);
  121. _this._changeOpacity(_this._updateDraggerPosition(first));
  122. },
  123. /**
  124. * 添加详情
  125. */
  126. _getShowInfo:function(){
  127. this.options.getShowInfoCallback(this.options.thematic_data);
  128. },
  129. /**
  130. * 鼠标滑动改变进度条
  131. * @param e
  132. * @private
  133. */
  134. _onSliderMove:function(){
  135. var _this = this;
  136. document.onmousemove = function(e){
  137. e = e || window.event;
  138. _this._changeOpacity(_this._updateDraggerPosition(e));
  139. };
  140. document.onmouseup = function(){
  141. document.onmousemove = null;
  142. document.onmouseup = null;
  143. };
  144. },
  145. /**
  146. * 更新进度条的位置
  147. * @param e
  148. * @returns {number}
  149. * @private
  150. */
  151. _updateDraggerPosition:function(e){
  152. var _this = this;
  153. var x = L.DomEvent.getMousePosition(e,_this._draggerContainer).x -
  154. _this._dragger.offsetWidth*0.5;
  155. if(x<0){
  156. x=0;
  157. }else if(x>_this._draggerContainer.offsetWidth-_this._dragger.offsetWidth){
  158. x=_this._draggerContainer.offsetWidth-_this._dragger.offsetWidth;
  159. }
  160. _this._dragger.style.left = x + 'px';
  161. _this._opacityNum.style.left = x + 'px';
  162. var op = 1-x/_this._draggerContainer.offsetWidth;
  163. if(op < 0.15){op = 0;}
  164. _this._opacityNum.innerHTML = parseInt(op*100)+'%';
  165. return op;
  166. },
  167. /**
  168. * 改变图层的透明度
  169. * @param opacity
  170. * @private
  171. */
  172. _changeOpacity:function(opacity){
  173. var _this = this;
  174. if(opacity >=0 && opacity <=1){
  175. _this._layer.setOpacity(opacity);
  176. _this._mainMap.fire("layerOpacity:change",{'layerOpacity':opacity});
  177. }
  178. },
  179. /**
  180. * 收藏专题图
  181. * @private
  182. */
  183. _favOverLayer:function(){
  184. this.options.favCallback(this.options.thematic_data);
  185. },
  186. /**
  187. * 隐藏专题图
  188. * @private
  189. */
  190. _hideOverLayer:function(){
  191. this.options.closeCallback(this.options);
  192. },
  193. /**
  194. * 改变面板显示/隐藏 3秒非操作状态 自动隐藏
  195. * @private
  196. */
  197. _changeState:function(){
  198. },
  199. });
  200. L.control.layerOpacity = function(options){
  201. return new L.Control.LayerOpacity(options);
  202. };