基于Flex的简单仪表盘制作

 

仪表盘效果图:

 

JSON:

{
    "title": {
        "text": "绩效目标执行规划表",
        "fontsize": "20",
        "fontColor":"Black"
    },
    "elements": [
        {
            "color": "0x9933CC",
            "text": "30",
            "value":30
        },
        {
            "color": "0xCC3399",
            "text": "150",
            "value":120
        },
        {
            "color": "0x80a033",
            "text": "200",
            "value":50
        }
    ],
    "min":"0",
    "base":"20",
    "target": "100",
    "value":100
}

 

实现思路:

  •  仪表盘为半圆形,每个数据区间颜色不同,使用flex的画圆方式无法实现。所以首先绘画出扇形区域。代码如下:
		/**
		 * 绘制扇形
		 * mc:扇形所在影片剪辑的名字
		 * x:扇形原点的横坐标
		 * y:扇形原点的横坐标
		 * r:扇形的半径
		 * angle:扇形的角度
		 * startForm:起始角度
		 * color:扇形的颜色
		 * 
		 */
		public static function DrawSector(mc:MovieClip,x:Number=200,y:Number=200,r:Number=100,angle:Number=27,startFrom:Number=270,color:Number=0xff0000, alpha:Number=1.0):void {
			mc.graphics.beginFill(color,50);
			mc.graphics.lineStyle(0,0x000000,alpha);
			mc.graphics.moveTo(x,y);
			angle=(Math.abs(angle)>360)?360:angle;
			var n:Number=Math.ceil(Math.abs(angle)/45);
			var angleA:Number=angle/n;
			angleA=angleA*Math.PI/180;
			startFrom=startFrom*Math.PI/180;
			mc.graphics.lineTo(x+r*Math.cos(startFrom),y+r*Math.sin(startFrom));
			for(var i:int=1; i<=n; i++) {
				startFrom+=angleA;
				var angleMid:Number=startFrom-angleA/2;
				var bx:Number=x+r/Math.cos(angleA/2)*Math.cos(angleMid);
				var by:Number=y+r/Math.cos(angleA/2)*Math.sin(angleMid);
				var cx:Number=x+r*Math.cos(startFrom);
				var cy:Number=y+r*Math.sin(startFrom);
				mc.graphics.curveTo(bx,by,cx,cy);
			}
			if (angle!=360) {
				mc.graphics.lineTo(x,y);
			}
			mc.graphics.endFill();
		}

 

注:以上部分为Google内容。

 

  • 根据数据总和评分为180份,算出角度。绘制表盘。中间白色部分画出一个圆覆盖即可。源码如下:
public static function DrawCircle(mc:MovieClip,x:Number=200,y:Number=200,r:Number=100, alpha:Number=50, color:Number=0xff0000):void{
	mc.graphics.beginFill(color, alpha);
	mc.graphics.drawCircle(x, y, r);
	mc.graphics.endFill();
}
  •  指针只需要根据目标值,转化角度即可。
var rotate:Rotate = new Rotate();
rotate.target = indicator;
rotate.angleFrom = 开始角度;
rotate.angleTo = 目标角度;
rotate.originX = 选转中心点坐标;
rotate.originY = 选转中心点坐标;
rotate.play();

  

 至此所有技术点准备完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值