⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panandzoom.as

📁 QS我也没用过
💻 AS
字号:
package
{
	import mx.charts.chartClasses.ChartElement;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import mx.charts.chartClasses.CartesianChart;
	import mx.charts.chartClasses.CartesianTransform;
	import mx.charts.LinearAxis;
	import mx.managers.CursorManager;

	public class PanAndZoom extends ChartElement
	{
		private var _startMin:Point;
		private var _startMax:Point;
		private var _startMouseData:Array;
		private var _start1PixelOffset:Array;
		private var _startOriginPixels:Point;
		private var _startMousePointInPixels:Point;
		private var _dragTool:String;
		

		[Embed("img/both.gif")]
		private var bothCursor:Class;

		public function PanAndZoom()
		{
			super();
			addEventListener(MouseEvent.MOUSE_DOWN,startPanAndZoom);
			addEventListener(MouseEvent.MOUSE_MOVE,updateCursor);
			addEventListener(MouseEvent.ROLL_OUT,removeCursor);
		}
		
		private function motionType(mouseX:Number,mouseY:Number):String
		{
			var ticks:Array = CartesianChart(chart).horizontalAxisRenderer.ticks;
			var bHorizontal:Boolean = false;			
			for(var i:int=0;i<ticks.length;i++)
			{
				if(Math.abs(mouseX - ticks[i]*unscaledWidth) <= 5)
				{
					bHorizontal = true;
					break;
				}
			}
			ticks = CartesianChart(chart).verticalAxisRenderer.ticks;
			var bVertical:Boolean = false;			
			for(i=0;i<ticks.length;i++)
			{
				if(Math.abs(mouseY - (ticks[i])*unscaledHeight) <= 5)
				{
					bVertical = true;
					break;
				}
			}
			if(bHorizontal || bVertical)
				return "zoomBoth";
			else
				return "pan";
		}

		private function removeCursor(e:MouseEvent):void
		{
			CursorManager.removeAllCursors();
		}

		private function updateCursor(e:MouseEvent):void
		{
			var motion:String = _dragTool;
			if(motion == null)
				motion = motionType(mouseX,mouseY);
			switch(motion)
			{
				case "zoomBoth":
					CursorManager.setCursor(bothCursor,-8,-8);
					break;
				case "pan":
					CursorManager.removeAllCursors();
					break;																																								
			}
		}

		private function startPanAndZoom(e:MouseEvent):void
		{
			systemManager.addEventListener(MouseEvent.MOUSE_MOVE,panAndZoom,true);
			systemManager.addEventListener(MouseEvent.MOUSE_UP,endPanAndZoom,true);						
			
			var hAxis:LinearAxis = LinearAxis(CartesianTransform(dataTransform).getAxis(CartesianTransform.HORIZONTAL_AXIS));
			var vAxis:LinearAxis = LinearAxis(CartesianTransform(dataTransform).getAxis(CartesianTransform.VERTICAL_AXIS));
			_startMin = new Point(hAxis.minimum,vAxis.minimum);
			_startMax = new Point(hAxis.maximum,vAxis.maximum);
			
			_startMousePointInPixels = new Point(mouseX,mouseY);
			_startMouseData = dataTransform.invertTransform(mouseX,mouseY);
			_start1PixelOffset = dataTransform.invertTransform(mouseX+1,mouseY+1);
			_start1PixelOffset[0] -= _startMouseData[0];
			_start1PixelOffset[1] -= _startMouseData[1];
						
			var cache:Array = [ {xV:0,yV:0} ];
			dataTransform.transformCache(cache,"xV","x","yV","y");
			_startOriginPixels = new Point(cache[0].x,cache[0].y);
			cache[0].xV = 1;
			cache[0].yV = 1;
			
			
			_dragTool = motionType(mouseX,mouseY);
		}
		private function panAndZoom(e:MouseEvent):void
		{
			var hAxis:LinearAxis = LinearAxis(CartesianTransform(dataTransform).getAxis(CartesianTransform.HORIZONTAL_AXIS));
			var vAxis:LinearAxis = LinearAxis(CartesianTransform(dataTransform).getAxis(CartesianTransform.VERTICAL_AXIS));
												
			if(_dragTool == "pan")
			{
				var dX:Number = mouseX - _startMousePointInPixels.x;
				var dY:Number = mouseY - _startMousePointInPixels.y;
				
				hAxis.maximum = _startMax.x - dX * _start1PixelOffset[0];
				hAxis.minimum = _startMin.x - dX * _start1PixelOffset[0];
				vAxis.maximum = _startMax.y - dY * _start1PixelOffset[1];
				vAxis.minimum = _startMin.y - dY * _start1PixelOffset[1];
								
			}
			else
			{
				var newMax:Number = _startMouseData[0] * (unscaledWidth - _startOriginPixels.x) / (mouseX - _startOriginPixels.x);
				var ratio:Number = newMax/_startMax.x;
				
				if(ratio > 0)
				{
					hAxis.maximum = ratio * _startMax.x;
					hAxis.minimum = ratio * _startMin.x;
				}
	
				var newMin:Number = _startMouseData[1] * (unscaledHeight - _startOriginPixels.y) / (mouseY - _startOriginPixels.y);
				ratio = newMin/_startMin.y;
				if(ratio > 0)
				{					
					vAxis.maximum = ratio * _startMax.y;
					vAxis.minimum = ratio * _startMin.y;
				}
			}
																								
//			e.stopPropagation();
			e.updateAfterEvent();
		}
		private function endPanAndZoom(e:MouseEvent):void
		{
//			e.stopPropagation();
			
			systemManager.removeEventListener(MouseEvent.MOUSE_MOVE,panAndZoom,true);
			systemManager.removeEventListener(MouseEvent.MOUSE_UP,endPanAndZoom,true);						
			_dragTool= null;	
		}
		
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			graphics.clear();
			graphics.moveTo(0,0);
			graphics.beginFill(0,0);
			graphics.drawRect(0,0,unscaledWidth,unscaledHeight);
		}
		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -