Android MPChart LineChart 管理类
import android.graphics.Color;import android.graphics.drawable.Drawable;import com.github.mikephil.charting.charts.LineChart;import com.github.mikephil.charting.components.AxisBase;import com....
·
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Yangzb on 2018/10/10 10:14
* E-mail:yangzongbin@si-top.com
* Describe:
*/
public class LineChartManager {
private LineChart lineChart;
private XAxis xAxis; //X轴
private YAxis leftYAxis; //左侧Y轴
private YAxis rightYAxis; //右侧Y轴 自定义XY轴值
private Legend legend; //图例
private LimitLine limitLine; //限制线
public LineChartManager(LineChart lineChart) {
this.lineChart = lineChart;
leftYAxis = lineChart.getAxisLeft();
rightYAxis = lineChart.getAxisRight();
xAxis = lineChart.getXAxis();
initChart(lineChart);
}
/**
* 初始化图表
*/
private void initChart(LineChart lineChart) {
lineChart.setNoDataTextColor(Color.parseColor("#0099E1"));
lineChart.setNoDataText("没有数据");
/***图表设置***/
//是否展示网格线
lineChart.setDrawGridBackground(false);
lineChart.setBackgroundColor(Color.WHITE);
//是否显示边界
lineChart.setDrawBorders(false);
//是否有触摸事件
lineChart.setTouchEnabled(true);
//是否可以拖动
lineChart.setDragEnabled(true);
lineChart.setDoubleTapToZoomEnabled(true);
//是否缩放Y轴
lineChart.setScaleYEnabled(false);
//设置XY轴动画效果
// lineChart.animateY(500);
// lineChart.animateX(500);
Description description = new Description();
// description.setText("需要展示的内容");
description.setEnabled(false);
lineChart.setDescription(description);
/***XY轴的设置***/
xAxis = lineChart.getXAxis();
leftYAxis = lineChart.getAxisLeft();
rightYAxis = lineChart.getAxisRight();
xAxis.setDrawGridLines(false);
rightYAxis.setDrawGridLines(false);
leftYAxis.setDrawGridLines(false);
//设置Y轴网格线为虚线
leftYAxis.enableGridDashedLine(10f, 10f, 0f);
leftYAxis.setEnabled(false);
rightYAxis.setEnabled(false);
//leftYAxis.setStartAtZero(false);
//X轴设置显示位置在底部
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setAxisMinimum(0f);
xAxis.setGranularity(1f);
xAxis.setAvoidFirstLastClipping(true);
//保证Y轴从0开始,不然会上移一点
leftYAxis.setAxisMinimum(0f);
// rightYAxis.setAxisMinimum(0f);
/***折线图例 标签 设置***/
legend = lineChart.getLegend();
//设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendForm 即可
legend.setForm(Legend.LegendForm.LINE);
legend.setTextSize(12f);
//显示位置 左下方
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
//是否绘制在图表里面
legend.setDrawInside(false);
//是否显示
legend.setEnabled(false);
}
public void showX(boolean show){
xAxis.setEnabled(show);
}
/**
* 展示一条曲线 默认x轴
*
* @param yData y轴的数据
* @param lineName 曲线名称
* @param color 曲线颜色
*/
public void showOneLineChart(List<Float> yData, String lineName, int color) {
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < yData.size(); i++) {
entries.add(new Entry(i, yData.get(i)));
}
// 每一个LineDataSet代表一条线
LineDataSet lineDataSet = new LineDataSet(entries, lineName);
// CUBIC_BEZIER 圆滑曲线
initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);
LineData data = new LineData();
data.addDataSet(lineDataSet);
lineChart.setData(data);
lineChart.invalidate();
}
/**
* 曲线初始化设置 一个LineDataSet 代表一条曲线
*
* @param lineDataSet 线条
* @param color 线条颜色
* @param mode
*/
private void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
lineDataSet.setColor(color);
lineDataSet.setCircleColor(color);
lineDataSet.setLineWidth(1f);
lineDataSet.setCircleRadius(3f);
lineDataSet.setDrawCircles(false);
lineDataSet.setDrawValues(false);
//设置曲线值的圆点是实心还是空心
lineDataSet.setDrawCircleHole(false);
lineDataSet.setValueTextSize(10f);
//设置折线图填充
lineDataSet.setDrawFilled(false);
lineDataSet.setFormLineWidth(1f);
lineDataSet.setFormSize(15.f);
if (mode != null) {
//设置曲线展示为圆滑曲线(如果不设置则默认折线)
lineDataSet.setDrawCircles(false);
lineDataSet.setMode(mode);
lineDataSet.setCubicIntensity(0.2f);//置曲线顺滑度
}
}
/**
* 展示一条曲线 默认x轴
*
* @param yData y轴的数据
* @param lineName 曲线名称
* @param color 曲线颜色
*/
public void showOneLineChartNoModo(List<Float> yData, String lineName, int color) {
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < yData.size(); i++) {
entries.add(new Entry(i, yData.get(i)));
}
// 每一个LineDataSet代表一条线
LineDataSet lineDataSet = new LineDataSet(entries, lineName);
// CUBIC_BEZIER 圆滑曲线 null表示折线
initLineDataSet(lineDataSet, color, null);
LineData data = new LineData();
data.addDataSet(lineDataSet);
lineChart.setData(data);
lineChart.invalidate();
}
/**
* 注意 集合的长度一致,在此未做处理
*
* @param yDataList List<Integer> 代表一条曲线的数据 yDataList.size 代表曲线的条数
* @param lineNames 曲线名称
* @param colors 曲线颜色
*/
public void showMultiNormalLineChart(List<List<Float>> yDataList, List<String> lineNames, List<Integer> colors) {
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
for (int i = 0; i < yDataList.size(); i++) {
ArrayList<Entry> entries = new ArrayList<>();
for (int j = 0; j < yDataList.get(i).size(); j++) {
entries.add(new Entry(j, yDataList.get(i).get(j)));
}
LineDataSet lineDataSet = new LineDataSet(entries, lineNames.get(i));
// initLineDataSet(lineDataSet, colors.get(i), LineDataSet.Mode.CUBIC_BEZIER);
initLineDataSet(lineDataSet, colors.get(i), null);
dataSets.add(lineDataSet);
}
LineData lineData = new LineData(dataSets);
lineChart.setData(lineData);
lineChart.animateX(2000);//设置x轴动画渐进
lineChart.invalidate();
}
/**
* 设置X轴的显示值
*
* @param min x轴最小值
* @param max x轴最大值
* @param labelCount x轴的分割数量
*/
public void setXAxisData(float min, float max, int labelCount) {
xAxis.setAxisMinimum(min);
xAxis.setAxisMaximum(max);
xAxis.setLabelCount(labelCount, false);
lineChart.invalidate();
}
/**
* 自定义的 X轴显示内容
*
* @param xAxisStr
* @param labelCount x轴的分割数量
*/
public void setXAxisData(final List<String> xAxisStr, int labelCount) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
xAxis.setLabelCount(labelCount, false);
xAxis.setValueFormatter((value, axis) -> {
String s = xAxisStr.get((int)value%xAxisStr.size());
return df.format(Float.valueOf(s));
});
lineChart.invalidate();
}
/**
* 设置Y轴值
*
* @param max
* @param min
* @param labelCount
*/
public void setYAxisData(float max, float min, int labelCount) {
leftYAxis.setAxisMaximum(max);
leftYAxis.setAxisMinimum(min);
leftYAxis.setLabelCount(labelCount, false);
rightYAxis.setAxisMaximum(max);
rightYAxis.setAxisMinimum(min);
rightYAxis.setLabelCount(labelCount, false);
lineChart.invalidate();
}
/**
* 自定义的 y轴显示内容
*
* @param yAxisStr
* @param labelCount y轴的分割数量
*/
public void setYAxisData(final List<String> yAxisStr, int labelCount) {
leftYAxis.setLabelCount(labelCount, false);
leftYAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return yAxisStr.get((int) value % yAxisStr.size());
}
});
lineChart.invalidate();
}
/**
* 设置高限制线
*
* @param high
* @param name
*/
public void setHighLimitLine(float high, String name, int color) {
if (name == null) {
name = "高限制线";
}
LimitLine highLimit = new LimitLine(high, name);
highLimit.setLineWidth(2f);
highLimit.setTextSize(10f);
highLimit.setLineColor(color);
highLimit.setTextColor(color);
leftYAxis.addLimitLine(highLimit);
lineChart.invalidate();
}
/**
* 设置低限制线
*
* @param low
* @param name
*/
public void setLowLimitLine(float low, String name, int color) {
if (name == null) {
name = "高限制线";
}
LimitLine lowLimit = new LimitLine(low, name);
lowLimit.setLineWidth(2f);
lowLimit.setTextSize(10f);
lowLimit.setLineColor(color);
lowLimit.setTextColor(color);
leftYAxis.addLimitLine(lowLimit);
lineChart.invalidate();
}
/**
* 设置描述信息
*
* @param str
*/
public void setDescription(String str) {
Description description = new Description();
description.setText(str);
lineChart.setDescription(description);
lineChart.invalidate();
}
/**
* 设置线条填充背景颜色
*
* @param drawable
*/
public void setChartFillDrawable(Drawable drawable) {
if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
LineDataSet lineDataSet = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
//避免在 initLineDataSet()方法中 设置了 lineDataSet.setDrawFilled(false); 而无法实现效果
lineDataSet.setDrawFilled(true);
lineDataSet.setFillDrawable(drawable);
lineChart.invalidate();
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)