• 【Android Studio学习】第二篇、APP实现画简易的波形图


    目录

    第一部分、前言

    1、效果展示

     2、参考博客

    3、实现方式

    第二部分、详细步骤

    1、添加波形函数的依赖

     2、添加一个管理类

    3、修改activity_main.xml文件的代码

     4、修改MainActivity.Java文件的代码

     5、连接手机进行仿真验证

     第三部分、总结

    1、写在后面

    2、完整工程代码

    3、QQ群号 


    第一部分、前言

            为了任务需求,还要实现APP能够画简易的折线图,为此,这篇博客会记录下我是如何实现简易的波形。

    1、效果展示

            首先,看一下你想要的结果是不是下面这个样子的。

     2、参考博客

            我这里实现的只是别人博客一小部分代码,博客链接在下面,这篇博客真的讲的太好了。我文章中的代码大部分都是来源于这篇博客,所以一定要看

    (2条消息) Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态添加数据_xhu_ww的博客-CSDN博客_android linechart多条曲线addentry

    3、实现方式

            这里我将在前一篇文章的工程基础上来实现这个功能,前面这篇博客主要是实现一个注册和登录界面,这篇博客加上波形的显示。【Android Studio学习】第一篇、制作一个拥有登录和注册功能的简易APP_大屁桃的博客-CSDN博客

    第二部分、详细步骤

    1、添加波形函数的依赖

    第一步、首先在Gradle Scripts下,打开第一个build.gradle,添加以下代码

    1. //添加的依赖
    2. allprojects {
    3. repositories {
    4. jcenter()
    5. maven { url "https://jitpack.io" }
    6. }
    7. }

     第二步、其次再在Gradle Scripts下,打开第二个build.gradle,添加以下代码

    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.2'

     第三步、点击Sync Now,立即同步所需的依赖,然后等待完成

     2、添加一个管理类

    第一步、在com.example.myapplication文件夹下,新建一个Java Class文件

     命名为LineChartFunction

     第二步、在LineChartFunction添加以下代码(画一条曲线的代码)。注意:如果想画多条曲线,请参考上面我提到的博客。

    1. package com.example.myapplication;
    2. import android.graphics.Color;
    3. import com.github.mikephil.charting.charts.LineChart;
    4. import com.github.mikephil.charting.components.Legend;
    5. import com.github.mikephil.charting.components.XAxis;
    6. import com.github.mikephil.charting.components.YAxis;
    7. import com.github.mikephil.charting.data.Entry;
    8. import com.github.mikephil.charting.data.LineData;
    9. import com.github.mikephil.charting.data.LineDataSet;
    10. public class LineChartFunction {
    11. private LineChart lineChart; //定义一个chart类型的数据
    12. private YAxis leftAxis; //定义左y轴
    13. private YAxis rightAxis; //定义右y轴
    14. private XAxis xAxis; //定义x 轴
    15. private LineDataSet lineDataSet;
    16. private LineData lineData;
    17. //一条曲线
    18. public LineChartFunction(LineChart mLineChart, String name, int color) {
    19. this.lineChart = mLineChart;
    20. leftAxis = lineChart.getAxisLeft();
    21. rightAxis = lineChart.getAxisRight();
    22. xAxis = lineChart.getXAxis();
    23. initLineChart();
    24. initLineDataSet(name, color);
    25. }
    26. /**
    27. * 初始化LineChar
    28. */
    29. private void initLineChart() {
    30. //网格的背景是灰色还是白色
    31. lineChart.setDrawGridBackground(false);
    32. //显示边界线,边界线被加粗
    33. lineChart.setDrawBorders(false);
    34. //折线图例 标签 设置
    35. Legend legend = lineChart.getLegend();
    36. legend.setForm(Legend.LegendForm.LINE);
    37. legend.setTextColor(Color.BLACK); //设置Legend 文本颜色
    38. legend.setTextSize(11f);//折线的对应名称字的大小
    39. //显示位置
    40. legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
    41. legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
    42. legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
    43. legend.setDrawInside(false);
    44. //X轴设置显示位置在底部
    45. xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    46. xAxis.setGranularity(1f);
    47. xAxis.setLabelCount(10);
    48. //取消右边y轴的显示
    49. rightAxis.setEnabled(false); //右侧Y轴不显示
    50. //设置网格颜色
    51. leftAxis.setGridColor(Color.WHITE); //网格线颜色
    52. leftAxis.setAxisLineColor(Color.BLACK); //Y轴颜色
    53. xAxis.setGridColor(Color.WHITE); //网格线颜色
    54. xAxis.setAxisLineColor(Color.BLACK); //X轴颜色
    55. //保证Y轴从0开始,不然会上移一点
    56. leftAxis.setAxisMinimum(0f);
    57. rightAxis.setAxisMinimum(0f);
    58. }
    59. /**
    60. * 初始化折线(一条线)
    61. *
    62. * @param name
    63. * @param color
    64. */
    65. private void initLineDataSet(String name, int color) {
    66. lineDataSet = new LineDataSet(null, name);
    67. lineDataSet.setLineWidth(1.5f);
    68. lineDataSet.setCircleRadius(1.5f);
    69. lineDataSet.setColor(color);//设置除了点之外折线的颜色
    70. //设置曲线值的圆点是实心还是空心
    71. lineDataSet.setDrawCircleHole(false);//false 实心 true 空心
    72. lineDataSet.setCircleColor(color);//设置折线上点的颜色也为黑色
    73. lineDataSet.setHighLightColor(color);
    74. //设置曲线填充
    75. lineDataSet.setDrawFilled(true);//就是曲线下面的颜色
    76. lineDataSet.setFillColor(color);//填充颜色
    77. lineDataSet.setDrawValues(false);//曲线上每个点的值,这里是取消显示
    78. lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
    79. lineDataSet.setValueTextSize(10f);//设置显示值的字体大小
    80. lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);//线模式为圆滑曲线(默认折线)
    81. //添加一个空的 LineData
    82. lineData = new LineData();
    83. lineChart.setData(lineData);
    84. lineChart.invalidate();
    85. }
    86. /**
    87. * 动态添加数据(一条折线图)
    88. *
    89. * @param number
    90. */
    91. public void addEntry(int number) {
    92. //最开始的时候才添加 lineDataSet(一个lineDataSet 代表一条线)
    93. if (lineDataSet.getEntryCount() == 0) {
    94. lineData.addDataSet(lineDataSet);
    95. }
    96. lineChart.setData(lineData);
    97. Entry entry = new Entry(lineDataSet.getEntryCount(), number);
    98. lineData.addEntry(entry, 0);
    99. //通知数据已经改变
    100. lineData.notifyDataChanged();
    101. lineChart.notifyDataSetChanged();
    102. //设置在曲线图中显示的最大数量
    103. lineChart.setVisibleXRangeMaximum(20);
    104. //移到某个位置
    105. lineChart.moveViewToX(lineData.getEntryCount() - 5);
    106. }
    107. /**
    108. * 设置Y轴值
    109. *
    110. * @param max
    111. * @param min
    112. * @param labelCount
    113. */
    114. public void setYAxis(float max, float min, int labelCount) {
    115. if (max < min) {
    116. return;
    117. }
    118. leftAxis.setAxisMaximum(max);
    119. leftAxis.setAxisMinimum(min);
    120. leftAxis.setLabelCount(labelCount, false);
    121. rightAxis.setAxisMaximum(max);
    122. rightAxis.setAxisMinimum(min);
    123. rightAxis.setLabelCount(labelCount, false);
    124. lineChart.invalidate();
    125. }
    126. }

    3、修改activity_main.xml文件的代码

    第一步、原始activity_main.xml布局文件中,只有一个“Hello World”,这里添加画曲线的所需的控件

     第二步、将代码改为以下代码,注意:将原始的约束布局androidx.constraintlayout.widget.ConstraintLayout改为线性布局LinearLayout。

    并且改为线性布局方向为垂直android:orientation="vertical"。

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. android:orientation="vertical"
    8. tools:context=".MainActivity">
    9. <LinearLayout
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"
    12. android:layout_marginTop="50dp">
    13. <TextView
    14. android:layout_width="wrap_content"
    15. android:layout_height="wrap_content"
    16. android:text="数据波形图:"
    17. android:textSize="25sp"
    18. android:textColor="@color/colorBlack" />
    19. LinearLayout>
    20. <LinearLayout
    21. android:layout_width="match_parent"
    22. android:layout_height="wrap_content"
    23. android:orientation="vertical">
    24. <com.github.mikephil.charting.charts.LineChart
    25. android:id="@+id/dynamic_chart1"
    26. android:layout_width="match_parent"
    27. android:layout_height="200dp"/>
    28. <Button
    29. android:layout_width="wrap_content"
    30. android:layout_height="wrap_content"
    31. android:text="随机数据"
    32. android:id="@+id/button_data1"
    33. android:layout_gravity="center" />
    34. LinearLayout>
    35. LinearLayout>

     第三步、得到的布局结果

     4、修改MainActivity.Java文件的代码

    第一步、MainActivity.Java修改代码如下

    1. package com.example.myapplication;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.graphics.Color;
    4. import android.os.Bundle;
    5. import android.view.View;
    6. import android.widget.Button;
    7. import com.github.mikephil.charting.charts.LineChart;
    8. public class MainActivity extends AppCompatActivity {
    9. //定义画图框变量
    10. private LineChartFunction dynamicLineChartManager1;
    11. @Override
    12. protected void onCreate(Bundle savedInstanceState) {
    13. super.onCreate(savedInstanceState);
    14. setContentView(R.layout.activity_main);
    15. //寻找控件ID
    16. final LineChart mChart1 = findViewById(R.id.dynamic_chart1);
    17. final Button button_data1 = findViewById(R.id.button_data1);
    18. dynamicLineChartManager1 = new LineChartFunction(mChart1, "数据", Color.GREEN);
    19. dynamicLineChartManager1.setYAxis(100, 0, 10);//最大值,最小值,中间刻度值的数量
    20. //按下按键实现的功能
    21. button_data1.setOnClickListener(new View.OnClickListener() {
    22. @Override
    23. public void onClick(View view) {
    24. //数据传入端口
    25. dynamicLineChartManager1.addEntry((int) (Math.random() * 100));
    26. }
    27. });
    28. }
    29. }

    添加的代码

     5、连接手机进行仿真验证

    使用方法:按下“随机数据”按键就会产生一个随机数,不停的点击按键,进而产生的随机数就构成了波形的数据点。

     注意:后期如果想显示单片机或者云端传过来数据的波形,只需要将这里的随机数改为APP接收的数据即可。

     第三部分、总结

    1、写在后面

            需要注意的是,博主这里只是去复现了别人的代码,如果想实现更高级的波形,比如一张图画多曲线,条形图等,请参考我上面提及到的博客。

    2、完整工程代码

            这是博主的完整的代码,可以直接下载,但是你是不是要关注点赞收藏,然后再下载?🤔🤔🤔博客中的工程

    3、QQ群号 

            有问题的小伙伴现在可以进群询问啦,当然我所有博客中涉及到的参考资料和工程都在群文件里。之前也在博客中放过群号,但是那个时候没有时间,群里面的小伙伴发的消息我都没时间回复,所以就把群号给屏蔽了,现在读研了,有时间了。欢迎大家的加入,群号:1020775171。群聊目前处于起步阶段,哈哈哈哈哈😂😂😂

  • 相关阅读:
    正则表达式——5.MatchObject对象、sub()方法
    Uniapp中嵌入H5( uniapp开发的H5),并且在H5中跳转到APP的指定页面
    NodeJS VM沙箱逃逸
    qt_vs_tools 设置
    HCIP第十八天——链路聚合,VRRP,IPV6
    Blender 之创建一个简单的笔筒
    【LeetCode刷题】-- 8.字符串转换整数(atoi)
    视频如何拼接?建议收藏这些方法
    cadence后仿真/寄生参数提取/解决pin口提取不全的问题
    [附源码]计算机毕业设计小区物业管理系统Springboot程序
  • 原文地址:https://blog.csdn.net/Learning1232/article/details/127650162