Android之MPAndroidChart动态折线图的简单实现及折线图上数据显示精度的设置
最近项目用到了折线统计图实时更新数据,用到了Android的MPAndroidChart组件,在这里总结一下,这个组件对于绘图来说,可以说是非常方便了,本文主要说一下动态折线图的基本使用
首先是导入依赖包
导入MPAndroidChart所需的依赖包,同时我还导入了butterknife的包,可以用于绑定视图;
1.projectde的gradle需要在allprojects下加入如下代码
allprojects {
repositories {
google()
maven { url "https://jitpack.io" }
jcenter()
}
}
2.module的gradle需要在dependencies下加入如下代码
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
动态折线图
先看效果图
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/dynamic_chart2"
android:layout_width="match_parent"
android:layout_height="380dp"/>
</LinearLayout>
所需要的工具类代码:
/**
* *Copyright:Copyright@2021Demon丶翊宸版权所有
* @Package: com.example.sj
* @Description: 动态折线图动态类
* @author: ly
* @date: 2021/3/30 11:00
*/
public class DynamicLineChartManager {
private LineChart lineChart;
private YAxis leftAxis;
private YAxis rightAxis;
private XAxis xAxis;
private LineData lineData;
private LineDataSet lineDataSet;
private List<ILineDataSet> lineDataSets = new ArrayList<>();
private SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");//设置日期格式
private List<String> timeList = new ArrayList<>(); //存储x轴的时间
//多条曲线
public DynamicLineChartManager(LineChart mLineChart, List<String> names, List<Integer> colors) {
this.lineChart = mLineChart;
leftAxis = lineChart.getAxisLeft();
rightAxis = lineChart.getAxisRight();
xAxis = lineChart.getXAxis();
initLineChart();
initLineDataSet(names, colors);
}
/**
* @Description: 初始化LineChar
* @author: ly
* @date: 2021/3/30 11:00
*/
private void initLineChart() {
lineChart.setDrawGridBackground(false);
// 显示边界
lineChart.setDrawBorders(true);
// 没有数据的时候,显示“暂无数据”
lineChart.setNoDataText("暂无数据");
// 禁止x轴y轴同时进行缩放
lineChart.setPinchZoom(false);
// 启用/禁用缩放图表上的两个轴。
lineChart.setScaleEnabled(false);
// 关闭Y轴
lineChart.getAxisRight().setEnabled(false);
lineChart.getAxisLeft().setEnabled(true);
//折线图例 标签 设置
Legend legend = lineChart.getLegend();
legend.setForm(Legend.LegendForm.CIRCLE);
legend.setTextSize(11f);
//显示位置 legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
legend.setDrawInside(false);
//X轴设置显示位置在底部
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//关闭x轴
xAxis.setEnabled(true);
xAxis.setGranularity(1f);
xAxis.setLabelCount(10);
// 不绘制网格线
xAxis.setDrawGridLines(false);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return timeList.get((int) value % timeList.size());
}
});
//保证Y轴从0开始,不然会上移一点
leftAxis.setAxisMinimum(0f);
rightAxis.setAxisMinimum(0f);
}
/**
* @Description: 初始化折线(多条线)
* @author: ly
* @date: 2021/3/30 11:00
*/
private void initLineDataSet(List<String> names, List<Integer> colors) {
for (int i = 0; i < names.size(); i++) {
lineDataSet = new LineDataSet(null, names.get(i));
lineDataSet.setColor(colors.get(i));
lineDataSet.setLineWidth(1.5f);
lineDataSet.setCircleRadius(1.5f);
lineDataSet.setColor(colors.get(i));
lineDataSet.setDrawFilled(false);
lineDataSet.setCircleColor(colors.get(i));
lineDataSet.setHighLightColor(colors.get(i));
lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
lineDataSet.setValueTextSize(10f);
xAxis.setDrawGridLines(false);
lineDataSets.add(lineDataSet);
}
//添加一个空的 LineData
lineData = new LineData();
lineChart.setData(lineData);
lineChart.invalidate();
}
/**
* @Description: 动态添加数据(多条折线图)
* @author: ly
* @date: 2021/3/30 10:59
*/
public void addEntry(List<Double> numbers) {
if (lineDataSets.get(0).getEntryCount() == 0) {
lineData = new LineData(lineDataSets);
lineData.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
DecimalFormat df = new DecimalFormat("#.000");
return ""+df.format(value);
}
});
lineChart.setData(lineData);
}
if (timeList.size() > 11) {
timeList.clear();
}
timeList.add(df.format(System.currentTimeMillis()));
for (int i = 0; i < numbers.size(); i++) {
Entry entry = new Entry(lineDataSet.getEntryCount(),numbers.get(i).floatValue());
lineData.addEntry(entry, i);
lineData.notifyDataChanged();
lineChart.notifyDataSetChanged();
lineChart.setVisibleXRangeMaximum(6);
lineChart.moveViewToX(lineData.getEntryCount() - 5);
}
}
/**
* @Description: 设置Y轴值
* @author: ly
* @date: 2021/3/30 10:56
*
*/
public void setYAxis(float max, float min, int labelCount) {
if (max < min) {
return;
}
leftAxis.setAxisMaximum(max);
leftAxis.setAxisMinimum(min);
leftAxis.setLabelCount(labelCount, false);
rightAxis.setAxisMaximum(max);
rightAxis.setAxisMinimum(min);
rightAxis.setLabelCount(labelCount, false);
lineChart.invalidate();
}
}
控制折线图上数据显示精度代码
lineData.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
DecimalFormat df = new DecimalFormat("#.000");//这里可以设置折线图上数据显示到小点后几位
return ""+df.format(value);
}
主界面MainActivity的调用
public class MainActivity extends AppCompatActivity {
private DynamicLineChartManager dynamicLineChartManager2;
private List<Double> list = new ArrayList<>();
private List<String> names = new ArrayList<>();
private List<Integer> colour = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LineChart mChart2 = (LineChart) findViewById(R.id.dynamic_chart2);
//设置折线名称
names.add("***");
names.add("***");
names.add("***");
names.add("***");
//设置折线颜色
colour.add(Color.CYAN);
colour.add(Color.GREEN);
colour.add(Color.BLUE);
colour.add(Color.YELLOW);
dynamicLineChartManager2 = new DynamicLineChartManager(mChart2, names, colour);
dynamicLineChartManager2.setYAxis(100, 0, 20);
//死循环添加数据
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
double value = (Math.random() * 20) + 1.5;
list.add(value);
list.add(30.1415);
list.add(38.9261);
dynamicLineChartManager2.addEntry(list);
list.clear();
}
});
}
}
}).start();
}
}
到这里为止,Android实现动态实时加载数据控制折线图上数据精度的Demo就完成了,写的不好的地方欢迎大家指出,Demo下载地址:Demon丶翊宸。最后,希望这篇文章对各位看官们有所帮助。对支持小编的看官们表示感谢。