曲线面积图AreaChartView

//安卓中曲线面积图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);
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值