MPAndroidChart绘制曲线图、柱状图总结(1)

}

@Override
public void refreshContent(Entry e, Highlight highlight) {
float value = e.getY();
textView.setText(DecimalFormatUtils.getIntOrFloatRemainOne(value));
}

@Override
public MPPointF getOffsetForDrawingAtPoint(float posX, float posY) {
return new MPPointF(-getWidth() / 2f, -getHeight() - 10);
}
}

(2), 通过addMaker 添加到图上

combinedChart.setMarker(new ChartMarkerView(context, R.layout.chart_markerview_layout));

以上就是对Chart 的一些基础设置,包括x,y轴改如何显示(颜色、大小)、图例、描述等等。

下面就看看如何来绘制曲线图呢?

数据设置

当我们要绘制曲线图、折线图、和柱状图等等的时候,怎样将我们要绘制的一个个数据点显示在图上的呢?MPAndroidChart 是用dataSet来表示的,我们需要将数据点包装成DataSet,然后设置到Chart,刷新绘制就ok了。MPAndroidChart 库中有很多DataSet,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以曲线图或者折线图为例,我们使用LineDataSet:

/**

  • 获取LineDataSet
  • @param entries
  • @param label
  • @param textColor
  • @param lineColor
  • @return
    */
    public static LineDataSet getLineData(List entries, String label, @ColorInt int textColor, @ColorInt int lineColor, boolean isFill) {
    LineDataSet dataSet = new LineDataSet(entries, label);
    // 设置曲线的颜色
    dataSet.setColor(lineColor);
    //数值文字颜色
    dataSet.setValueTextColor(textColor);
    // 模式为贝塞尔曲线
    dataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
    // 是否绘制数据值
    dataSet.setDrawValues(false);
    // 是否绘制圆点
    dataSet.setDrawCircles(true);
    dataSet.setDrawCircleHole(false);
    // 这里有一个坑,当我们想隐藏掉高亮线的时候,MarkerView 跟着不见了
    // 因此只有将它设置成透明色
    dataSet.setHighlightEnabled(true);// 隐藏点击时候的高亮线
    //设置高亮线为透明色
    dataSet.setHighLightColor(Color.TRANSPARENT);

if (isFill) {
//是否设置填充曲线到x轴之间的区域
dataSet.setDrawFilled(true);
// 填充颜色
dataSet.setFillColor(lineColor);
}
//设置圆点的颜色
dataSet.setCircleColor(lineColor);
// 设置圆点半径
dataSet.setCircleRadius(3.5f);
// 设置线的宽度
dataSet.setLineWidth(1f);
return dataSet;
}

将数据绘制到图表上

如果是一条曲线,直接用LineChart 和LineData就好,如果有多条曲线,就需要用CombinedChart 和 CombinedData (混合图、混合数据)。可以是LineData 和BarData 混合来绘制曲线和柱状的混合图。

/**

  • 初始化数据
  • @param chart
  • @param lineDatas
    */
    public static void initData(CombinedChart chart, LineData… lineDatas) {
    CombinedData combinedData = new CombinedData();
    for (LineData lineData : lineDatas) {
    combinedData.setData(lineData);
    }

chart.setData(combinedData);
chart.invalidate();
}

最后调用invalidate 绘制。

柱状图

柱状图跟曲线图其实是一样的,图表基础配置一样,然后将数据点包装成BarData,最后包装成BarDataSet。

/**

  • 初始化柱状图图表数据
  • @param chart
  • @param entries
  • @param title
  • @param barColor
    */
    public static void initBarChart(BarChart chart, List entries, String title, @ColorInt int barColor) {
    BarDataSet set1 = new BarDataSet(entries, title);
    set1.setValueTextColor(Color.WHITE);
    set1.setColor(barColor);
    ArrayList dataSets = new ArrayList<>();
    dataSets.add(set1);

BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
// 设置bar的宽度,但是点很多少的时候好像没作用,会拉得很宽
data.setBarWidth(0.1f);
// 设置value值 颜色
data.setValueTextColor(Color.WHITE);
//设置y轴显示的标签
data.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
return ((int) (value * 100)) + “%”;
}
});

chart.setData(data);
chart.invalidate();
}

工具类

项目中有很多出使用曲线图和柱状图的地方,因此抽取了一个工具类,完整代码如下:

public class MPChartUtils {
/**

  • 不显示无数据的提示
  • @param mChart
    /
    public static void NotShowNoDataText(Chart mChart) {
    mChart.clear();
    mChart.notifyDataSetChanged();
    mChart.setNoDataText(“你还没有记录数据”);
    mChart.setNoDataTextColor(Color.WHITE);
    mChart.invalidate();
    }
    /
    *
  • 配置Chart 基础设置
  • @param mChart 图表
  • @param mLabels x 轴标签
  • @param yMax y 轴最大值
  • @param yMin y 轴最小值
  • @param isShowLegend 是否显示图例
    */
    public static void configChart(CombinedChart mChart, List mLabels, float yMax, float yMin, boolean isShowLegend) {

mChart.setDrawGridBackground(false);
mChart.setDrawBorders(false);
mChart.setScaleEnabled(false);
mChart.setDragEnabled(true);
mChart.setNoDataText(“”);
// 不显示描述数据
mChart.getDescription().setEnabled(false);
mChart.getAxisRight().setEnabled(false);

Legend legend = mChart.getLegend();
// 是否显示图例
if (isShowLegend) {
legend.setEnabled(true);
legend.setTextColor(Color.WHITE);
legend.setForm(Legend.LegendForm.CIRCLE);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
legend.setYEntrySpace(20f);
//图例的大小
legend.setFormSize(7f);
// 图例描述文字大小
legend.setTextSize(10);
legend.setXEntrySpace(20f);

} else {
legend.setEnabled(false);
}

XAxis xAxis = mChart.getXAxis();

// 是否显示x轴线
xAxis.setDrawAxisLine(true);
// 设置x轴线的颜色
xAxis.setAxisLineColor(Color.parseColor(“#4cffffff”));
// 是否绘制x方向网格线
xAxis.setDrawGridLines(false);
//x方向网格线的颜色
xAxis.setGridColor(Color.parseColor(“#30FFFFFF”));

// 设置x轴数据的位置
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
// 设置x轴文字的大小
xAxis.setTextSize(12);

// 设置x轴数据偏移量
xAxis.setYOffset(5);
final List labels = mLabels;
// 显示x轴标签
IAxisValueFormatter formatter = new IAxisValueFormatter() {

@Override
public String getFormattedValue(float value, AxisBase axis) {
int index = (int) value;
if (index < 0 || index >= labels.size()) {
return “”;
}
return labels.get(index);
// return labels.get(Math.min(Math.max((int) value, 0), labels.size() - 1));
}

};
// 引用标签
xAxis.setValueFormatter(formatter);
// 设置x轴文字颜色
xAxis.setTextColor(mChart.getResources().getColor(R.color.char_text_color));
// 设置x轴每最小刻度 interval
xAxis.setGranularity(1f);

YAxis yAxis = mChart.getAxisLeft();
//设置x轴的最大值
yAxis.setAxisMaximum(yMax);
// 设置y轴的最大值
yAxis.setAxisMinimum(yMin);
// 不显示y轴
yAxis.setDrawAxisLine(false);
// 设置y轴数据的位置
yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
// 不从y轴发出横向直线
yAxis.setDrawGridLines(false);
// 是否显示y轴坐标线
yAxis.setDrawZeroLine(true);
// 设置y轴的文字颜色
yAxis.setTextColor(mChart.getResources().getColor(R.color.char_text_color));
// 设置y轴文字的大小
yAxis.setTextSize(12);
// 设置y轴数据偏移量
//yAxis.setXOffset(30);
// yAxis.setYOffset(-3);
yAxis.setXOffset(15);
// yAxis.setGranularity(yGranularity);
yAxis.setLabelCount(5, false);
//yAxis.setGranularity(5);//interval

Matrix matrix = new Matrix();
// 根据数据量来确定 x轴缩放大倍
if (mLabels.size() <= 10) {
matrix.postScale(1.0f, 1.0f);
} else if (mLabels.size() <= 15) {
matrix.postScale(1.5f, 1.0f);
} else if (mLabels.size() <= 20) {
matrix.postScale(2.0f, 1.0f);
} else {
matrix.postScale(3.0f, 1.0f);
}

// 在图表动画显示之前进行缩放
mChart.getViewPortHandler().refresh(matrix, mChart, false);
// x轴执行动画
mChart.animateX(500);

}

/**

  • 初始化数据
  • @param chart
  • @param lineDatas
    */
    public static void initData(CombinedChart chart, LineData… lineDatas) {
    CombinedData combinedData = new CombinedData();
    for (LineData lineData : lineDatas) {
    combinedData.setData(lineData);
    }
    chart.setData(combinedData);
    chart.invalidate();
    }

/**

  • 获取LineDataSet
  • @param entries
  • @param label
  • @param textColor
  • @param lineColor
  • @return
    */
    public static LineDataSet getLineData(List entries, String label, @ColorInt int textColor, @ColorInt int lineColor, boolean isFill) {
    LineDataSet dataSet = new LineDataSet(entries, label);
    // 设置曲线的颜色
    dataSet.setColor(lineColor);
    //数值文字颜色
    dataSet.setValueTextColor(textColor);
    // 模式为贝塞尔曲线
    dataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
    // 是否绘制数据值
    dataSet.setDrawValues(false);
    // 是否绘制圆点
    dataSet.setDrawCircles(true);
    dataSet.setDrawCircleHole(false);
    // 这里有一个坑,当我们想隐藏掉高亮线的时候,MarkerView 跟着不见了
    // 因此只有将它设置成透明色
    dataSet.setHighlightEnabled(true);// 隐藏点击时候的高亮线
    //设置高亮线为透明色
    dataSet.setHighLightColor(Color.TRANSPARENT);

if (isFill) {
//是否设置填充曲线到x轴之间的区域
dataSet.setDrawFilled(true);
// 填充颜色
dataSet.setFillColor(lineColor);
}
//设置圆点的颜色
dataSet.setCircleColor(lineColor);
// 设置圆点半径
dataSet.setCircleRadius(3.5f);
// 设置线的宽度
dataSet.setLineWidth(1f);
return dataSet;
}

/**

  • 获取barDataSet
  • @param entries
  • @param label
  • @param textColor
  • @param lineColor
  • @return
    */
    public static BarDataSet getBarDataSet(List entries, String label, @ColorInt int textColor, @ColorInt int lineColor) {
    BarDataSet dataSet = new BarDataSet(entries, label);
    dataSet.setBarBorderWidth(5);
    dataSet.setBarShadowColor(lineColor);
    dataSet.setValueTextColor(textColor);
    dataSet.setDrawValues(false);
    return dataSet;
    }

/**

  • 配置柱状图基础设置
  • @param barChart
  • @param xLabels
    */
    public static void configBarChart(BarChart barChart, final List xLabels) {
    barChart.getDescription().setEnabled(false);//设置描述
    barChart.setPinchZoom(false);//设置按比例放缩柱状图
    barChart.setScaleEnabled(false);
    barChart.setDragEnabled(true);
    barChart.setNoDataText(“”); // 没有数据时的提示文案
    //x坐标轴设置
    // IAxisValueFormatter xAxisFormatter = new StringAxisValueFormatter(xAxisValue);//设置自定义的x轴值格式化器
    XAxis xAxis = barChart.getXAxis();//获取x轴
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置X轴标签显示位置
    xAxis.setDrawGridLines(false);//不绘制格网线
    xAxis.setGranularity(1f);//设置最小间隔,防止当放大时,出现重复标签。
    // 显示x轴标签
    IAxisValueFormatter formatter = new IAxisValueFormatter() {

@Override
public String getFormattedValue(float value, AxisBase axis) {
return xLabels.get(Math.min(Math.max((int) value, 0), xLabels.size() - 1));
}

};
xAxis.setValueFormatter(formatter);
xAxis.setTextSize(10);//设置标签字体大小
xAxis.setTextColor(barChart.getResources().getColor(R.color.char_text_color));
xAxis.setAxisLineColor(Color.parseColor(“#4cffffff”));
xAxis.setLabelCount(xLabels.size());//设置标签显示的个数

//y轴设置
YAxis leftAxis = barChart.getAxisLeft();//获取左侧y轴
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);//设置y轴标签显示在外侧
leftAxis.setAxisMinimum(0f);//设置Y轴最小值
leftAxis.setDrawGridLines(false);
leftAxis.setDrawLabels(true);//禁止绘制y轴标签
leftAxis.setDrawAxisLine(false);//禁止绘制y轴
leftAxis.setAxisLineColor(Color.parseColor(“#4cffffff”));
leftAxis.setTextColor(barChart.getResources().getColor(R.color.char_text_color));
leftAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return ((int) (value * 100)) + “%”;
}
});

barChart.getAxisRight().setEnabled(false);//禁用右侧y轴
barChart.getLegend().setEnabled(false);
//图例设置
/* Legend legend = barChart.getLegend();
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);//图例水平居中
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);//图例在图表上方
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);//图例的方向为水平
legend.setDrawInside(false);//绘制在chart的外侧
legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);//图例中的文字方向

legend.setForm(Legend.LegendForm.SQUARE);//图例窗体的形状
legend.setFormSize(0f);//图例窗体的大小
legend.setTextSize(16f);//图例文字的大小*/
//legend.setYOffset(-2f);

Matrix matrix = new Matrix();
// 根据数据量来确定 x轴缩放大倍
if (xLabels.size() <= 10) {
matrix.postScale(1.0f, 1.0f);
} else if (xLabels.size() <= 15) {
matrix.postScale(1.5f, 1.0f);
} else if (xLabels.size() <= 20) {
matrix.postScale(2.0f, 1.0f);
} else {
matrix.postScale(3.0f, 1.0f);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

image

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2017-2021字节跳动Android面试历年真题解析》

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

va基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

[外链图片转存中…(img-nLGRmxp8-1711868140754)]

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-MsWJEzC0-1711868140754)]

《2017-2021字节跳动Android面试历年真题解析》

[外链图片转存中…(img-QEZtLJcy-1711868140754)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值