XCL-Charts强大的仪表盘

XCL-Charts中的仪表盘是我封装的最麻烦的图之一。原因嘛,用过的人都知道,这类图太有特色了,要弄出一个适用于大部份情况的封装出来实在不容易。

还好,经过一翻折腾,总算搞出来一套自已感觉还行的方法。

先展示下效果:

还可以吧。

这类图封装分开看,从总布局角度看分为180,270,90,360等不同角度的仪表盘。从内容看则主要有两个部份的难点,丰富多彩的各类环与各类指针。

大家注意观察下上图demo中的环与指针就明白有多少类吧。

我在封装时,把不同风格的环分为8大类. 来绘制处理大部份各类环形风格,然后用户可通过属性的细调来画出适合自已需求的图。

因为类别太多,我就不在这一一对每个环形轴显示成什么样举例了。

至于指针,如demo所见,我在这展示了几种不同风格的指针,及其多指针叠加显示的方法。 这当然不包含全部,通过属性的组合设置及与环形轴的配合。

用户可以定制各种类型的指针。因为基本的计算和绘制要素图表库已经搭建好并开放出来了。所以不用担心没合适的指针可绘制。

指针是一方面,回到我们的主要问题点。demo中有各种各类的图,是不是我在图表库中每一个都独立封装一个呢?

答案当然是不,我的解决方法如下:

前面提过,我封装了8大类的轴风格。在实现绘制时,用户可以自己决定add哪些轴,并显示在图中的哪个位置。

我的方法很明显了,把所有的决定权交给用户,通过用户自己的add,再通过相关的轴的属性设置来画出他们自己满意的效果。

    他们有多少创意,都可以通过自由组合方式绘制出来。

噢,忘记了,还有一个仪表盘中文字的显示。常要定制各种不同的文字,对于这个,我的解决方法同样是,把决定权交给用户。

    让用户定好文字及设置好paint画笔属性后,传入用户指定的显示位置即可。 想怎么弄就怎么弄吧,我上图的demo已经证明了。

说这么多没用,我拿上面demo其中混合图(包含了270,180,90三种仪表盘及不同轴的add方法)的例子的代码在这展示下吧。

/**
 * Copyright 2014  XCL-Charts
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @Project XCL-Charts
 * @Description Android图表基类库演示
 * @author XiongChuanLiang<br/>([email protected])
 * @license http://www.apache.org/licenses/  Apache v2 License
 * @version 1.3
 */
package com.demo.xclcharts.view;

import java.util.ArrayList;
import java.util.List;

import org.xclcharts.chart.DialChart;
import org.xclcharts.common.DensityUtil;
import org.xclcharts.common.MathHelper;
import org.xclcharts.renderer.XEnum;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.Log;

public class DialChart07View extends GraphicalView {

	private String TAG = "DialChart07View";	

	private DialChart chart = new DialChart();
	private DialChart chart180 = new DialChart();
	private DialChart chart90 = new DialChart();
	private float mPercentage = 0.9f;

	public DialChart07View(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initView();
	}

	public DialChart07View(Context context, AttributeSet attrs){
        super(context, attrs);
        initView();
	 }

	 public DialChart07View(Context context, AttributeSet attrs, int defStyle) {
			super(context, attrs, defStyle);
			initView();
	 }

	 private void initView()
	 {
		chartRender();
		chartRender90();
		chartRender180();
	 }

	 @Override
	    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
	        super.onSizeChanged(w, h, oldw, oldh);
	        chart.setChartRange(w ,h );
	        chart180.setChartRange(w/2 ,h/3 );
	        chart90.setChartRange(w ,h/3 );
	    }  		

		public void chartRender()
		{
			try {								

				chart.setPadding(0, DensityUtil.dip2px(getContext(), 100), 0, 0);

				//设置标题背景
				chart.setApplyBackgroundColor(true);
				chart.setBackgroundColor( (int)Color.rgb(28, 129, 243) );
				//绘制边框
				chart.showRoundBorder();

				chart.setTotalAngle(270f);

				//设置当前百分比
				chart.getPointer().setPercentage(mPercentage);

				//设置指针长度
				chart.getPointer().setLength(0.65f,0.2f);	

				//增加轴承
				addAxis();
				/////////////////////////////////////////////////////////////
				//增加指针
				addPointer();
				//设置附加信息
				addAttrInfo();
				/////////////////////////////////////////////////////////////

			} catch (Exception e) {
				// TODO Auto-generated catch block
				Log.e(TAG, e.toString());
			}

		}

		public void chartRender180()
		{
			try {
				chart180.setTotalAngle(180f);
				chart180.setStartAngle(180f);

				//设置当前百分比
				chart180.getPointer().setPercentage(mPercentage);

				//设置指针长度
				chart180.getPointer().setPointerStyle(XEnum.PointerStyle.TRIANGLE);
				chart180.getPointer().setLength(0.65f,0.2f);	

				List<Float> ringPercentage = new ArrayList<Float>();
				float rper = MathHelper.getInstance().div(1, 4); //相当于40%	//270, 4
				ringPercentage.add(rper);
				ringPercentage.add(rper);
				ringPercentage.add(rper);
				ringPercentage.add(rper);

				List<Integer> rcolor  = new ArrayList<Integer>();
				rcolor.add((int)Color.rgb(242, 110, 131));
				rcolor.add((int)Color.rgb(238, 204, 71));
				rcolor.add((int)Color.rgb(42, 231, 250));
				rcolor.add((int)Color.rgb(140, 196, 27));
				chart180.addStrokeRingAxis(0.75f,0.6f, ringPercentage, rcolor);
				chart180.getPlotAxis().get(0).getFillAxisPaint().setColor((int)Color.rgb(28, 129, 243) );

				Paint paintTB = new Paint();
				paintTB.setColor(Color.WHITE);
				paintTB.setTextAlign(Align.CENTER);
				paintTB.setTextSize(22);
				paintTB.setAntiAlias(true);
				chart180.addAttributeInfo(XEnum.Location.BOTTOM, "180度仪表盘", 0.5f, paintTB);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				Log.e(TAG, e.toString());
			}

		}

		public void chartRender90()
		{
			try {

				chart90.setPadding(DensityUtil.dip2px(getContext(), 150),0, 0, 0);
				chart90.setTotalAngle(90f);
				chart90.setStartAngle(270f);

				List<Float> ringPercentage = new ArrayList<Float>();
				float rper = MathHelper.getInstance().div(1, 2); //相当于40%	//270, 4
				ringPercentage.add(rper);
				ringPercentage.add(rper);

				List<Integer> rcolor  = new ArrayList<Integer>();
				rcolor.add((int)Color.rgb(242, 110, 131));
				rcolor.add((int)Color.rgb(238, 204, 71));
				chart90.addStrokeRingAxis(0.75f,0.6f, ringPercentage, rcolor);
				chart90.getPlotAxis().get(0).getFillAxisPaint().setColor((int)Color.rgb(28, 129, 243) );
				chart90.getPointer().setLength(0.65f);	

				Paint paintTB = new Paint();
				paintTB.setColor(Color.WHITE);
				paintTB.setTextAlign(Align.CENTER);
				paintTB.setTextSize(22);
				paintTB.setAntiAlias(true);
				chart90.addAttributeInfo(XEnum.Location.BOTTOM, "90度仪表盘", 0.5f, paintTB);

			} catch (Exception e) {
				// TODO Auto-generated catch block
				Log.e(TAG, e.toString());
			}

		}

		public void addAxis()
		{

			List<String> rlabels2  = new ArrayList<String>();
			for(int i=0;i<7;i++)
			{
				rlabels2.add(Integer.toString(i * 10));
			}
			chart.addInnerTicksAxis(0.7f, rlabels2);
			chart.getPlotAxis().get(0).getAxisPaint().setColor(Color.WHITE);
			chart.getPlotAxis().get(0).getAxisPaint().setStrokeWidth(8);
			chart.getPlotAxis().get(0).getTickMarksPaint().setColor(Color.WHITE);
			chart.getPlotAxis().get(0).getTickLabelPaint().setColor(Color.WHITE);

			List<String> rlabels3  = new ArrayList<String>();
			for(int i=0;i<5;i++)
			{
				if(0 == i)
				{
					rlabels3.add("");
				}else
					rlabels3.add(Integer.toString(i * 10));
			}

			chart.addOuterTicksAxis(0.8f, rlabels3);
			chart.getPlotAxis().get(1).getAxisPaint().setColor(Color.RED);
			chart.getPlotAxis().get(1).getAxisPaint().setStrokeWidth(5);

			chart.getPointer().setPointerStyle(XEnum.PointerStyle.TRIANGLE);
			chart.getPointer().getPointerPaint().setStrokeWidth(3);
			chart.getPointer().getPointerPaint().setStyle(Style.FILL);		

			chart.getPointer().getPointerPaint().setColor((int)Color.rgb(242, 110, 131));
			chart.getPointer().getBaseCirclePaint().setColor((int)Color.rgb(238, 204, 71));
			chart.getPointer().setBaseRadius(10f);

		}

		//增加指针
		public void addPointer()
		{
		}

		private void addAttrInfo()
		{
			Paint paintTB = new Paint();
			paintTB.setColor(Color.WHITE);
			paintTB.setTextAlign(Align.CENTER);
			paintTB.setTextSize(22);
			paintTB.setAntiAlias(true);
			chart.addAttributeInfo(XEnum.Location.BOTTOM, "270度仪表盘", 0.5f, paintTB);
		}

		public void setCurrentStatus(float percentage)
		{
			mPercentage =  percentage;

			//清理
			chart.clearAll();
			chart90.clearAll();
			chart180.clearAll();

			//设置当前百分比
			chart.getPointer().setPercentage(mPercentage);
			addAxis();
			//增加指针
			addPointer();
			addAttrInfo();

			chartRender180();
			chartRender90();
			chart90.getPointer().setPercentage(mPercentage);
			chart180.getPointer().setPercentage(mPercentage);
		}

		@Override
		public void render(Canvas canvas) {
			// TODO Auto-generated method stub
			 try{
				 	chart.render(canvas);
		            chart90.render(canvas);
		            chart180.render(canvas);

		        } catch (Exception e){
		        	Log.e(TAG, e.toString());
		        }
		}

}

代码有点乱,但用于展示功能足够了。

好了,不多说了,想要了具体了解的,自己上github开源中国下代码看吧。

 相信我,我弄的这个图表库,总有一点功能会是你所需要的。 嘿嘿。

BLOG:http://blog.csdn.net/xcl168

Mail: [email protected]

XCL-Charts强大的仪表盘

时间: 2024-10-07 09:00:01

XCL-Charts强大的仪表盘的相关文章

美爆了!轻流移动端2.0重磅上线

2017年9月 轻流推出手机端 时隔一年半 轻流手机端2.0   想你所想,但做到比你想象的更多 现在,扫描二维码即可申请使用新版手机端了 1.界面设计 全新界面设计方案,让轻流更“轻” 推倒旧版的深沉,带来更加明亮轻快的黄色,让你在忙碌的工作中也能保持好心情 2.首页 加入独立首页,专为高效办公设计 通过首页的动态功能以及常用应用,快速触达你的各项工作 3.应用中心 全新的应用中心,全而不乱 采用图标显示代替列表显示,让你看到更多的同时,看得更清晰:二级菜单及搜索框的加入,使应用寻找不再繁琐

CORNERSTONE | 好用到哭的项目管理工具

项目管理是一个周期漫长的系统化工程,更是一个全员参与,全面资源管理,并且需要全过程管控的系统化工程,尤其是项目过程管控和项目质量管控最为关键.项目管理不是某个部门的事,也不是某几个人的事,而是一个全员参与的过程,在项目全过程中任何一个环节管控不到位,轻则影响项目进度,重则导致项目质量不过关,对项目发生致命性的影响. 传统的项目管理模式,会导致诸多项目管理问题:1. 如何能保障项目质量,让项目多快好省的做成?2. 如何能保障项目各项数据和文件安全?3. 如何能在漫长的项目周期过程中,规避各种风险?

Swift 很强大的图表库-Charts使用

前言: 今天分享一个很漂亮的功能强大的图表库,希望对有需要的同学, 有帮助, 喜欢请点个赞,支持一下.谢谢~ 在项目中如何加入Swift库请看我的上一篇文章 http://www.jianshu.com/p/fd91c10c9f55 编译环境: Xcode7.3 添加Charts图表库 // 在Podfile中 use_frameworks! pod 'Charts' import Charts 创建柱状图 func createLineChartView() { chartView = Bar

10 款强大的JavaScript图表图形插件推荐

转自:http://www.iteye.com/news/24535 网上有很多用于绘制图表图形的免费JavaScript插件和图表库,这类插件大量出现的原因,一是人们不再依赖于Flash,二是浏览器和精密的计算使呈现实时数据变得容易,而且各种向量绘图技术像VML.SVG和Canvas的发展也使之成为可能. 本文推荐10款强大的绘制图表图形的JavaScript插件.其中一些插件需要主流浏览器的支持,而另外一些经过整合后,也能在不同的平台和老版本的浏览器上工作.有些工具是独立的框架,大部分支持常

功能强大的商业图表控件Essential Chart for ASP.NET MVC

Essential Chart for ASP.NET MVC是一款功能强大的商业图表控件,提供了创新的数据对象模型可以很容易地与多种数据源进行绑定,提供了35种图表类型,支持2D和3D显示,多轴显示.实时数据显示.导出为图片以及打印和打印预览,软件开发人员可以使用该控件开发出专业的商业应用程序. 具体功能: 支持无限制数据序列和无限制数据点 支持多种坐标轴样式 支持自定义轴标签和显示方向 支持轴反转和颠倒轴 支持自定义数据点 支持图表放大和滚动以及panning 控件提供了交互式地十字光标,可

推荐三款强大的Js图表库

1.百度的Echart ECharts,缩写来自Enterprise Charts,是百度推出的一款开源的,商业级数据图表,它最初是为了满足百度公司商业体系里各种业务系统(如凤巢.广告管家等等)的报表需求. 2.Highcharts 中文网站:http://www.hcharts.cn/ Highcharts是国外的一款功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库.Highcharts针对个人用户及非商业用途免费,商业用途需要购买授权. 3.阿里的G2 G2(The Gram

G2 2.0 更灵活、更强大、更完备的可视化引擎!

概述 G2作为一款技术产品,自诞生以来,服务于广大的Web工程师群体和一部分数据分析师.一直来,G2 因其易用的语法和扎实的可视化理论基础,广受使用者好评.G2 1.x 的可视化能力已经非常强大,使用者已经能够在掌握图形语法的基础上结合自己对数据的理解,从而绘制出各种各样的可视化图表.然而,随着DT时代的更加深化,随着G2的发展,我们还是遇到了各种各样的,以往G2无法满足的可视化需求.经总结发现,大体上有以下几点: 数据导向,同一张图表中,绘制异构数据图形的需求 设计导向,对图形高度订制的需求

Cloud Insight 仪表盘上线 | 全面监控 Redis

OneAPM 作为应用性能领域的新兴领军企业,近期发布了重量级新产品—— Cloud Insight 数据管理平台,用它能够监控所有基础组件,并通过 tag 标签对数据进行管理. 近日,Cloud Insight (Ci) 探针仪表盘功能重磅上线,默认安装了探针,配置平台服务就会自动生成相应的仪表盘,而且仪表盘将包含所有数据.此外,本文也将重点介绍 Redis 的几项监控指标以及一些值得注意的部分,希望给使用 Redis 的读者带来一些帮助. 仪表盘 任意时间段数据查询 默认只能显示最近一小时的

Cognos Analytics——轻松、快速地创建仪表盘,帮您做出决策!

在整个企业内部推广商务智能 快速.可执行的洞察力有助于推动智慧决策和业务成效 若要改善绩效并获得竞争优势,决策者必须要能够快 速解决问题并抓住新机会.他们需要敏捷的.直观的 分析解决方案,以便能够及时应对瞬息万变的条件. IT 管理人员面对不同的挑战.由于预算紧缩.资源有 限,商务智能 (BI) 解决方案必须将企业对 IT 员工的 需求将至最低水平,同时还需确保较低的维护需求并 大幅缩短宕机时间. IBM? Cognos? Analytics 可针对这些需求提供引导 式的自助服务功能.该平台提供