• 折线图的代码


    LineChart: 

    1. package com.example.air_conditioner;
    2. import android.content.Context;
    3. import android.graphics.Color;
    4. import android.graphics.Paint.Align;
    5. import org.achartengine.ChartFactory;
    6. import org.achartengine.GraphicalView;
    7. import org.achartengine.chart.PointStyle;
    8. import org.achartengine.model.XYMultipleSeriesDataset;
    9. import org.achartengine.model.XYSeries;
    10. import org.achartengine.renderer.XYMultipleSeriesRenderer;
    11. import org.achartengine.renderer.XYSeriesRenderer;
    12. import java.util.List;
    13. /**
    14. * 动态折线图
    15. */
    16. public class LineChart {
    17. private GraphicalView mGraphicalView;
    18. private XYMultipleSeriesDataset multipleSeriesDataset;// 数据集容器
    19. private XYMultipleSeriesRenderer multipleSeriesRenderer;// 渲染器容器
    20. private XYSeries mSeries;// 单条曲线数据集
    21. private XYSeriesRenderer mRenderer;// 单条曲线渲染器
    22. private Context context;
    23. public LineChart(Context context) {
    24. this.context = context;
    25. }
    26. /**
    27. * 获取图表
    28. *
    29. * @return
    30. */
    31. public GraphicalView getGraphicalView() {
    32. mGraphicalView = ChartFactory.getCubeLineChartView(context, multipleSeriesDataset, multipleSeriesRenderer, 0.1f);
    33. return mGraphicalView;
    34. }
    35. /**
    36. * 获取数据集,及xy坐标的集合
    37. *
    38. * @param curveTitle 曲线名称
    39. */
    40. public void setXYMultipleSeriesDataset(String curveTitle) {
    41. multipleSeriesDataset = new XYMultipleSeriesDataset();
    42. mSeries = new XYSeries(curveTitle);
    43. multipleSeriesDataset.addSeries(mSeries);
    44. }
    45. /**
    46. * 获取渲染器
    47. *
    48. * @param maxX
    49. * x轴最大值
    50. * @param maxY
    51. * y轴最大值
    52. * @param chartTitle
    53. * 曲线的标题
    54. * @param xTitle
    55. * x轴标题
    56. * @param yTitle
    57. * y轴标题
    58. * @param axeColor
    59. * 坐标轴颜色
    60. * @param labelColor
    61. * 标题颜色
    62. * @param curveColor
    63. * 曲线颜色
    64. * @param gridColor
    65. * 网格颜色
    66. */
    67. public void setXYMultipleSeriesRenderer(double maxX, double maxY,
    68. String chartTitle, String xTitle, String yTitle, int axeColor,
    69. int labelColor, int curveColor, int gridColor) {
    70. multipleSeriesRenderer = new XYMultipleSeriesRenderer();
    71. if (chartTitle != null) {
    72. multipleSeriesRenderer.setChartTitle(chartTitle);
    73. }
    74. // 渲染器容器
    75. multipleSeriesRenderer.setXTitle(xTitle);
    76. multipleSeriesRenderer.setYTitle(yTitle);
    77. // 设置xy坐标轴的范围
    78. multipleSeriesRenderer.setRange(new double[] { 0, maxX, 0, maxY });//xy轴的范围
    79. // 标题颜色
    80. multipleSeriesRenderer.setLabelsColor(labelColor);
    81. multipleSeriesRenderer.setXLabels(10);
    82. multipleSeriesRenderer.setYLabels(10);
    83. multipleSeriesRenderer.setXLabelsAlign(Align.RIGHT);
    84. multipleSeriesRenderer.setYLabelsAlign(Align.RIGHT);
    85. // 设置坐标轴的标题字体大小
    86. multipleSeriesRenderer.setAxisTitleTextSize(20);
    87. // 设置坐标轴的标题大小
    88. multipleSeriesRenderer.setChartTitleTextSize(20);
    89. multipleSeriesRenderer.setLabelsTextSize(20);
    90. multipleSeriesRenderer.setLegendTextSize(20);
    91. multipleSeriesRenderer.setPointSize(2f);//曲线描点尺寸
    92. multipleSeriesRenderer.setFitLegend(true);
    93. multipleSeriesRenderer.setMargins(new int[] { 20, 30, 15, 20 });
    94. // 设置网格
    95. multipleSeriesRenderer.setShowGrid(true);
    96. multipleSeriesRenderer.setZoomEnabled(true, false);
    97. // 设置坐标轴颜色
    98. multipleSeriesRenderer.setAxesColor(axeColor);
    99. multipleSeriesRenderer.setGridColor(gridColor);
    100. multipleSeriesRenderer.setAxesColor(Color.rgb(128, 138, 135)); //坐标轴颜色
    101. multipleSeriesRenderer.setLabelsColor(Color.WHITE); //标签颜色
    102. multipleSeriesRenderer.setMarginsColor(Color.rgb(37, 40, 46)); //图表周围颜色
    103. multipleSeriesRenderer.setGridColor(Color.DKGRAY); //表格颜色
    104. // multipleSeriesRenderer.setBackgroundColor(Color.BLACK);//背景色
    105. // multipleSeriesRenderer.setMarginsColor(Color.BLACK);//边距背景色,默认背景色为黑色,这里修改为白色
    106. mRenderer = new XYSeriesRenderer();
    107. // 设置曲线颜色
    108. mRenderer.setColor(curveColor);
    109. mRenderer.setPointStyle(PointStyle.POINT);//描点风格,可以为圆点,方形点等等
    110. multipleSeriesRenderer.addSeriesRenderer(mRenderer);
    111. }
    112. // TODO:
    113. /**
    114. * 设置图表属性和数据
    115. */
    116. public void setChartSettings(XYMultipleSeriesRenderer renderer) {
    117. // 添加自定义限制线
    118. renderer.addYTextLabel(4.5, "Custom Line", 0);// 在 y=4.5 的位置添加一条标题为 "Custom Line" 的限制线
    119. renderer.setChartTitle("Chart demo");
    120. renderer.setXTitle("xValues");
    121. renderer.setYTitle("yValues");
    122. renderer.setXAxisMin(0.5);
    123. renderer.setXAxisMax(10.5);
    124. renderer.setYAxisMin(0);
    125. renderer.setYAxisMax(12);
    126. }
    127. /**
    128. * 根据新加的数据,更新曲线,只能运行在主线程
    129. *
    130. * @param x
    131. * 新加点的x坐标
    132. * @param y
    133. * 新加点的y坐标
    134. */
    135. // public void updateChart(double x, double y) {
    136. // mSeries.add(x, y);
    137. // mGraphicalView.repaint(); //此处也可以调用invalidate()
    138. //
    139. // }
    140. /**
    141. * 根据新加的数据,更新曲线,并将图表滚动到最新的点处,只能运行在主线程
    142. *
    143. * @param x 新加点的x坐标
    144. * @param y 新加点的y坐标
    145. */
    146. public void updateChart(double x, double y) {
    147. mSeries.add(x, y);
    148. // 扩大 x 轴范围以显示整个折线图
    149. double maxX = x + 50;
    150. multipleSeriesRenderer.setRange(new double[] { 0, maxX, 0, multipleSeriesRenderer.getYAxisMax()});
    151. if (mSeries.getItemCount() > 1) {
    152. // 将 x 轴范围设为最新点的位置附近
    153. double newMaxX = x + (multipleSeriesRenderer.getXAxisMax() - multipleSeriesRenderer.getXAxisMin()) / 50;
    154. multipleSeriesRenderer.setRange(new double[] { newMaxX - 50, newMaxX, 0, multipleSeriesRenderer.getYAxisMax() });
    155. }
    156. mGraphicalView.repaint();
    157. }
    158. /**
    159. * 添加新的数据,多组,更新曲线,只能运行在主线程
    160. * @param yList
    161. */
    162. public void updateChart(List yList) {
    163. int flag = 10;
    164. for (int i = 0; i < yList.size(); i++) {
    165. mSeries.add(flag, yList.get(i));
    166. flag += 10;
    167. }
    168. mGraphicalView.repaint();//此处也可以调用invalidate()
    169. }
    170. public void updateChart(int x,int[] yList) {
    171. for (int i = 0; i < yList.length; i++) {
    172. mSeries.add(x, yList[i]);
    173. x++;
    174. }
    175. mGraphicalView.repaint();//此处也可以调用invalidate()
    176. }
    177. /**
    178. * 清除曲线数据
    179. */
    180. public void clearChart() {
    181. mSeries.clear();
    182. mGraphicalView.repaint();
    183. }
    184. }

     

    DataFragment: 

    1. package com.example.air_conditioner;
    2. import android.graphics.Color;
    3. import android.os.Bundle;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.ViewGroup;
    7. import android.widget.LinearLayout;
    8. import androidx.fragment.app.Fragment;
    9. import org.achartengine.GraphicalView;
    10. import java.util.ArrayList;
    11. import java.util.List;
    12. public class DataFragment extends Fragment {
    13. /**
    14. * 存放x、y、z轴加速度的曲线的布局容器
    15. **/
    16. private LinearLayout temperatureLayout; // 温度
    17. private LinearLayout humidityLayout; // 湿度
    18. private LinearLayout electricityLayout; // 电流
    19. private LinearLayout voltageLayout; // 电压
    20. private LinearLayout powerLayout; // 功率
    21. /**
    22. * 折线图
    23. */
    24. private LineChart temperatureLineChart;
    25. private LineChart humidityLineChart;
    26. private LineChart electricityLineChart;
    27. private LineChart voltageLineChart;
    28. private LineChart powerLineChart;
    29. /**
    30. * 用来加载到布局器的view
    31. **/
    32. private GraphicalView temperature_wave_view;
    33. private GraphicalView humidity_wave_view;
    34. private GraphicalView electricity_wave_view;
    35. private GraphicalView voltage_wave_view;
    36. private GraphicalView power_wave_view;
    37. /**
    38. * 数据集合
    39. */
    40. private List tList,vList,pList,eList,hList;
    41. @Override
    42. public View onCreateView(LayoutInflater inflater, ViewGroup container,
    43. Bundle savedInstanceState) {
    44. // Inflate the layout for this fragment
    45. View view = inflater.inflate(R.layout.linechart, container, false);
    46. initView(view);
    47. return view;
    48. }
    49. private void initView(View view) {
    50. temperatureLayout = view.findViewById(R.id.temperature);
    51. humidityLayout = view.findViewById(R.id.humidity);
    52. electricityLayout = view.findViewById(R.id.electricity);
    53. voltageLayout = view.findViewById(R.id.voltage);
    54. powerLayout = view.findViewById(R.id.power);
    55. // 初始化图表
    56. initChart();
    57. temperatureLayout.addView(temperature_wave_view,new ViewGroup.LayoutParams(
    58. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    59. humidityLayout.addView(humidity_wave_view,new ViewGroup.LayoutParams(
    60. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    61. electricityLayout.addView(electricity_wave_view,new ViewGroup.LayoutParams(
    62. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    63. voltageLayout.addView(voltage_wave_view,new ViewGroup.LayoutParams(
    64. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    65. powerLayout.addView(power_wave_view,new ViewGroup.LayoutParams(
    66. ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    67. }
    68. private void initChart() {
    69. temperatureLineChart = new LineChart(getContext());
    70. powerLineChart = new LineChart(getContext());
    71. humidityLineChart = new LineChart(getContext());
    72. voltageLineChart = new LineChart(getContext());
    73. electricityLineChart = new LineChart(getContext());
    74. electricityLineChart.setXYMultipleSeriesDataset("电流曲线");
    75. humidityLineChart.setXYMultipleSeriesDataset("湿度曲线");
    76. powerLineChart.setXYMultipleSeriesDataset("功率曲线");
    77. voltageLineChart.setXYMultipleSeriesDataset("电压曲线");
    78. temperatureLineChart.setXYMultipleSeriesDataset("温度曲线");
    79. electricityLineChart.setXYMultipleSeriesRenderer(120,10,"电流曲线","时间/min","电流/A",
    80. Color.BLACK, Color.RED, Color.RED, Color.BLACK);;
    81. temperatureLineChart.setXYMultipleSeriesRenderer(120,30,"温度曲线","时间/min","温度/°C",
    82. Color.BLACK, Color.RED, Color.RED, Color.BLACK);
    83. humidityLineChart.setXYMultipleSeriesRenderer(120,10,"湿度曲线","时间/min","湿度/RH",
    84. Color.BLACK, Color.GREEN, Color.GREEN, Color.BLACK);
    85. powerLineChart.setXYMultipleSeriesRenderer(120,10,"功率曲线","时间/min","功率/W",
    86. Color.BLACK, Color.GREEN, Color.GREEN, Color.BLACK);
    87. voltageLineChart.setXYMultipleSeriesRenderer(120,10,"电压曲线","时间/min","电压/V",
    88. Color.BLACK, Color.WHITE, Color.WHITE, Color.BLACK);
    89. temperature_wave_view = temperatureLineChart.getGraphicalView();
    90. power_wave_view = powerLineChart.getGraphicalView();
    91. voltage_wave_view = voltageLineChart.getGraphicalView();
    92. humidity_wave_view = humidityLineChart.getGraphicalView();
    93. electricity_wave_view = electricityLineChart.getGraphicalView();
    94. // 初始化数据
    95. initData();
    96. }
    97. private void initData() {
    98. pList = new ArrayList<>();
    99. vList = new ArrayList<>();
    100. eList = new ArrayList<>();
    101. hList = new ArrayList<>();
    102. tList = new ArrayList<>();
    103. for (int i = 0; i < 12; i++) {
    104. pList.add(i, (float) (Math.random()*10));
    105. vList.add(i, (float) (Math.random()*10));
    106. eList.add(i, (float) (Math.random()*10));
    107. hList.add(i, (float) (Math.random()*10));
    108. tList.add(i, (float) (Math.random()*10)+10);
    109. }
    110. electricityLineChart.updateChart(eList);
    111. humidityLineChart.updateChart(hList);
    112. temperatureLineChart.updateChart(tList);
    113. voltageLineChart.updateChart(vList);
    114. powerLineChart.updateChart(pList);
    115. }
    116. }

     linechart:

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:orientation="vertical"
    5. android:background="#25282e"
    6. android:layout_height="match_parent">
    7. <LinearLayout
    8. android:layout_width="match_parent"
    9. android:layout_height="wrap_content"
    10. >
    11. LinearLayout>
    12. <ScrollView
    13. android:layout_width="fill_parent"
    14. android:layout_height="fill_parent"
    15. android:fillViewport="true"
    16. >
    17. <LinearLayout
    18. android:layout_width="fill_parent"
    19. android:layout_height="wrap_content"
    20. android:orientation="vertical"
    21. >
    22. <LinearLayout
    23. android:id="@+id/temperature"
    24. android:layout_width="fill_parent"
    25. android:layout_height="250dp"
    26. android:layout_gravity="center_horizontal"
    27. android:orientation="vertical"
    28. />
    29. <LinearLayout
    30. android:id="@+id/humidity"
    31. android:layout_width="fill_parent"
    32. android:layout_height="250dp"
    33. android:layout_gravity="center_horizontal"
    34. android:orientation="vertical"
    35. />
    36. <LinearLayout
    37. android:id="@+id/electricity"
    38. android:layout_width="fill_parent"
    39. android:layout_height="250dp"
    40. android:layout_gravity="center_horizontal"
    41. android:orientation="vertical"
    42. />
    43. <LinearLayout
    44. android:id="@+id/voltage"
    45. android:layout_width="fill_parent"
    46. android:layout_height="250dp"
    47. android:layout_gravity="center_horizontal"
    48. android:orientation="vertical"
    49. />
    50. <LinearLayout
    51. android:id="@+id/power"
    52. android:layout_width="fill_parent"
    53. android:layout_height="250dp"
    54. android:layout_gravity="center_horizontal"
    55. android:orientation="vertical"
    56. />
    57. LinearLayout>
    58. ScrollView>
    59. LinearLayout>

    效果图: 

     

  • 相关阅读:
    解决 Rust Tauri 1.0 构建时下载 WiX失败
    Spring Boot 链路追踪 SkyWalking 入门
    rabbitMQ学习-发布和确认
    python经典百题之判断回文数
    【C++】如何修改set的值
    YOLOv5 onnx \tensorrt 推理
    TIA博途Wincc Advanced下载项目的具体方法演示(V16版本)
    Visual Studio 2022使用MinGW来编译调试C/C++程序
    ffmpeg草稿
    大数据因果推理与学习入门综合概述
  • 原文地址:https://blog.csdn.net/A125679880/article/details/133682529