//安卓中曲线面积图AreaChartView,多条曲线可以显示在一个表格中,自由设置宽高,和线的宽度
public class MainActivity extends Activity {@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<com.chatsdenm.AreaChart01View
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
/**
* 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/>(xcl_168@aliyun.com)
* @Copyright Copyright (c) 2014 XCL-Charts (www.xclcharts.com)
* @license http://www.apache.org/licenses/ Apache v2 License
* @version 1.0
*/
package com.chatsdenm;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.xclcharts.chart.AreaChart;
import org.xclcharts.chart.AreaData;
import org.xclcharts.common.IFormatterDoubleCallBack;
import org.xclcharts.common.IFormatterTextCallBack;
import org.xclcharts.renderer.XChart;
import org.xclcharts.renderer.XEnum;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
* @ClassName AreaChart01View
* @Description 面积图例子
* @author
*/
public class AreaChart01View extends DemoView implements Runnable {
private String TAG = "AreaChart01View";
private AreaChart chart = new AreaChart();
// 标签集合
private LinkedList<String> mLabels = new LinkedList<String>();
// 数据集合
private LinkedList<AreaData> mDataset = new LinkedList<AreaData>();
private Paint mPaintTooltips = new Paint(Paint.ANTI_ALIAS_FLAG);
public AreaChart01View(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView();
}
public AreaChart01View(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public AreaChart01View(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private void initView() {
chartLabels();
chartDataSet();
chartRender();
new Thread(this).start();
}
// @Override
// protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// super.onSizeChanged(w, h, oldw, oldh);
// // 图所占范围大小
// }
private void chartRender() {
try {
// 设置绘图区默认缩进px值,留置空间显示Axis,Axistitle....
int[] ltrb = getBarLnDefaultSpadding();
chart.setPadding(ltrb[0], ltrb[1], ltrb[2], ltrb[3]);
// 轴数据源
// 标签轴
chart.setCategories(mLabels);
// 数据轴
chart.setDataSource(mDataset);
chart.setCrurveLineStyle(XEnum.CrurveLineStyle.BEELINE);
// 数据轴最大值
chart.getDataAxis().setAxisMax(100);
// 数据轴刻度间隔
chart.getDataAxis().setAxisSteps(10);
// 网格
chart.getPlotGrid().showHorizontalLines();
chart.getPlotGrid().showVerticalLines();
// 把顶轴和右轴隐藏
// chart.hideTopAxis();
// chart.hideRightAxis();
// 把轴线和刻度线给隐藏起来
chart.getDataAxis().hideAxisLine();
chart.getDataAxis().hideTickMarks();
chart.getCategoryAxis().hideAxisLine();
chart.getCategoryAxis().hideTickMarks();
/*
* //标题 chart.setTitle("区域图(Area Chart)");
* chart.addSubtitle("(XCL-Charts Demo)"); //轴标题
* chart.getAxisTitle().setLowerAxisTitle("(年份)");
*/
// 透明度
chart.setAreaAlpha(200);
chart.setChartRange(550, 700);
/*
* //显示图例 chart.getPlotLegend().showLegend();
*
* //激活点击监听 chart.ActiveListenItemClick(); //为了让触发更灵敏,可以扩大5px的点击监听范围
* chart.extPointClickRange(5);
*/
// 定义数据轴标签显示格式
chart.getDataAxis().setLabelFormatter(new IFormatterTextCallBack() {
@Override
public String textFormatter(String value) {
// TODO Auto-generated method stub
Double tmp = Double.parseDouble(value);
DecimalFormat df = new DecimalFormat("#0");
String label = df.format(tmp).toString();
return (label);
}
});
// 设定交叉点标签显示格式
chart.setItemLabelFormatter(new IFormatterDoubleCallBack() {
@Override
public String doubleFormatter(Double value) {
// TODO Auto-generated method stub
DecimalFormat df = new DecimalFormat("#0");
String label = df.format(value).toString();
return label;
}
});
// chart.disablePanMode();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.toString());
}
}
private void chartDataSet() {
// 将标签与对应的数据集分别绑定
// 标签对应的数据集
// List<Double> dataSeries1 = new LinkedList<Double>();
// dataSeries1.add((double) 0.01); // 55
// dataSeries1.add((double) 60);
// dataSeries1.add((double) 71);
// dataSeries1.add((double) 40);
// dataSeries1.add((double) 35);
//
List<Double> dataSeries2 = new LinkedList<Double>();
dataSeries2.add((double) 10);
dataSeries2.add((double) 22);
dataSeries2.add((double) 30);
dataSeries2.add((double) 30); // 30
dataSeries2.add((double) 0); // 15
List<Double> dataSeries3 = new LinkedList<Double>();
dataSeries3.add((double) 35);
dataSeries3.add((double) 45);
dataSeries3.add((double) 65);
dataSeries3.add((double) 75);
dataSeries3.add((double) 55);
// 设置每条线各自的显示属性
// key,数据集,线颜色,区域颜色
// AreaData line1 = new AreaData("小熊", dataSeries1, Color.BLUE,
// Color.YELLOW);
// // 不显示点
// line1.setDotStyle(XEnum.DotStyle.HIDE);
// /*
// * line1.setApplayGradient(true);
// line1.setAreaBeginColor(Color.WHITE);
// * line1.setAreaEndColor(Color.YELLOW);
// */
//
AreaData line2 = new AreaData("小小熊", dataSeries2, (int) Color.rgb(79,
200, 100), Color.GREEN);
// 设置线上每点对应标签的颜色
line2.getDotLabelPaint().setColor(Color.RED);
// 设置点标签
line2.setLabelVisible(true);
AreaData line3 = new AreaData("小小小熊", dataSeries3, Color.rgb(246, 134,
31), Color.rgb(213, 198, 126));
// 设置线上每点对应标签的颜色
// line3.getDotLabelPaint().setColor(Color.YELLOW);
line3.setLineStyle(XEnum.LineStyle.DOT);
// mDataset.add(line1);
mDataset.add(line3);
mDataset.add(line2);
}
private void chartLabels() {
mLabels.add("2010");
mLabels.add("2011");
mLabels.add("2012");
mLabels.add("2013");
mLabels.add("2014");
}
@Override
public void render(Canvas canvas) {
try {
chart.render(canvas);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
@Override
public List<XChart> bindChart() {
// TODO Auto-generated method stub
List<XChart> lst = new ArrayList<XChart>();
lst.add(chart);
return lst;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
super.onTouchEvent(event);
return false;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
chartAnimation();
} catch (Exception e) {
Thread.currentThread().interrupt();
}
}
private void chartAnimation() {
try {
chart.getPlotLegend().hide();
int[] ltrb = getBarLnDefaultSpadding();
// for (int i = 8; i > 0; i--) {
// Thread.sleep(5000);
// chart.setPadding(ltrb[0], ltrb[1], i * ltrb[2], ltrb[3]);
//
// if (1 == i)
// drawTitle();
// postInvalidate();
// }
chart.setPadding(ltrb[0], ltrb[1], ltrb[2], ltrb[3]);
drawTitle();
} catch (Exception e) {
Thread.currentThread().interrupt();
}
}
private void drawTitle() {
// 标题
// chart.setTitle("区域图(Area Chart)");
// chart.addSubtitle("(XCL-Charts Demo)");
// 轴标题
// chart.getAxisTitle().setLowerAxisTitle("(年份)");
// 显示图例
chart.getPlotLegend().show();
// 激活点击监听
// chart.ActiveListenItemClick();
// 为了让触发更灵敏,可以扩大5px的点击监听范围
// chart.extPointClickRange(5);
// chart.showClikedFocus();
}
}
package com.chatsdenm;
import java.util.List;
import org.xclcharts.common.DensityUtil;
import org.xclcharts.renderer.XChart;
import org.xclcharts.view.ChartView;
import android.content.Context;
import android.util.AttributeSet;
public class DemoView extends ChartView {
public DemoView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public DemoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DemoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public List<XChart> bindChart() {
// TODO Auto-generated method stub
return null;
}
protected int[] getBarLnDefaultSpadding() {
int[] ltrb = new int[4];
ltrb[0] = DensityUtil.dip2px(getContext(), 30); // left
ltrb[1] = DensityUtil.dip2px(getContext(), 60); // top
ltrb[2] = DensityUtil.dip2px(getContext(), 30); // right
ltrb[3] = DensityUtil.dip2px(getContext(), 40); // bottom
return ltrb;
}
protected int[] getPieDefaultSpadding() {
int[] ltrb = new int[4];
ltrb[0] = DensityUtil.dip2px(getContext(), 20); // left
ltrb[1] = DensityUtil.dip2px(getContext(), 65); // top
ltrb[2] = DensityUtil.dip2px(getContext(), 20); // right
ltrb[3] = DensityUtil.dip2px(getContext(), 20); // bottom
return ltrb;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
}