Android Studio平台下使用hellochart实现从txt文件读取数据绘折线图

Android Studio平台下使用hellochart实现从文本读取数据绘折线图

本人是一个刚刚接触Android不超过两个月的小白,最近在做的论文是关于这一块的相关内容。所有的东西都是自学的,听导师的建议也是第一次留个这样的资料,可能有很多地方理解不到位,也欢迎大家给我更多的建议,让我学习进步。

首先先导入了一个第三方包:hellocharts-library-1.5.8.jar,目的是用来绘图。然后在res文件夹下新建raw文件夹,在raw文件夹内放入文本数据,我自己这里是a.txt

在这里插入图片描述

a.txt内是从串口接收到的数据再保存下来的,这一块因为是从学长那里接手的,目前还没太搞懂,留待以后解决。现在还是回来读取数据在绘折线图这一块。

   /**
     * 初始化表格设置
     */
    private void initLineChart() {
        Line line =new Line(mPointValues).setColor(Color.BLUE);//将数据点填充到线上,并设置线的颜色为蓝色
        List<Line> lines = new ArrayList<Line>();          //创建了一个ArrayList对象;<>用于向参数化类
                                                           // 型传递参数;传递进入一个Line类型的变量作为参数,详细可见泛型
        // List是Collection接口的子接口 List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
        line.setShape(ValueShape.CIRCLE);                  //折线上每个数据点的形状,设置为圆形
        line.setCubic(false);                               //曲线是否圆滑
        line.setFilled(false);  //是否填充曲线的面积
        line.setHasLabels(true);//曲线的数据坐标是否加上备注
        line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
        line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
        line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)



        lines.add(line);//个人理解,将以上设置的 应用对象“line”的字段传给"lines"
        LineChartData data = new LineChartData();
        data.setLines(lines);//以上三行代码,均为导入折线的初始设置





        //坐标轴
        Axis axisX = new Axis();//创建X轴的引用变量
        Axis axisY = new Axis();//Y轴

        axisX.setName("道址数");
        axisY.setName("计数");

        data.setAxisXBottom(axisX);//X轴设置在底部
        data.setAxisYLeft(axisY);//Y轴设置在左侧



        //数据添加
        data.setBaseValue(Float.NEGATIVE_INFINITY);
        lineChart.setLineChartData(data);


        //设置平行缩放等行为属性
        lineChart.setInteractive(true);
        lineChart.setZoomType(ZoomType.HORIZONTAL_AND_VERTICAL);//水平跟垂直方向上的放大
        lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
        //上一行代码为设置水平方向可以滚动
        lineChart.setVisibility(View.VISIBLE);

        //动画效果
//         prepareDataAnimation();
        lineChart.startDataAnimation(1000);


    }

初始化表格属性完成之后,就是添加数据,具体代码如下:

/**
 * 设置X 轴的显示
 */
private void getAxisXLables(){
    for (int i = 0; i < Xdate.length; i++) {
        mAxisXValues.add(new AxisValue(i).setLabel(Xdate[i]));
    }
}
 /**
     * 图表的每个点的显示
     */
    private void getAxisPoints() {
        for (int i = 0; i < showdata.length; i++) {
            mPointValues.add(new PointValue(i, showdata[i]));
        }
    }

最后是从文件中读取数据:


    public  String getString (InputStream inputStream) {
        InputStreamReader inputStreamReader = null;
        try {
            inputStreamReader = new InputStreamReader(inputStream, "gbk");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        BufferedReader reader = new BufferedReader(inputStreamReader);   //创建一个输入流
        StringBuffer sb = new StringBuffer();
        String line;

        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                sb.append("\n");


            }
        } catch (IOException e) {
            e.printStackTrace();

        }

        score=sb.toString();
        return  sb.toString();
    }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <lecho.lib.hellocharts.view.LineChartView
        android:id="@+id/chart_01"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

最后,整个Mainactivity.java放上来,里面有部分内容还在测试,是为后续的算法做的准备,例如HashMap这一块。

package com.example.administrator.exchangetype;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import lecho.lib.hellocharts.gesture.ContainerScrollType;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.view.LineChartView;

 - public class MainActivity extends AppCompatActivity {
       //折线图
       private LineChartView lineChart;
       private List<PointValue> mPointValues = new ArrayList<PointValue>();
       private List<AxisValue> mAxisXValues = new ArrayList<AxisValue>();
       static String score;
       String[] Xdate=new String[1023];
       int[] showdata=new int[1023];
       int anum;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lineChart = (LineChartView) findViewById(R.id.chart_01);

        InputStream inputStream = getResources().openRawResource(R.raw.a);
        getString(inputStream);

        for (anum=0;anum<1023;anum++){
            Xdate[anum]= anum+"";
        }


    

        String ss[] = score.split(" ");
        byte scorechang[] = new byte[ss.length];

        for (int i = 0; i < ss.length-1; i++) {
            scorechang[i] = (byte) Integer.parseInt(ss[i],16);
            showdata[i]=(int)scorechang[i];
        }


//        tvtext.setText(scorechang.toString());            测试用

        initLineChart();//初始化设置
        getAxisPoints();//X轴的显示





        //paixv
        Map<String,Integer> map = new HashMap<>();

        for(String str : ss ){
            Integer num = map.get(str);
            map.put(str,num == null ? 1 : num + 1);
        }
        Set set = map.entrySet();
        Iterator it = set.iterator();

        while (it.hasNext()){
            Map.Entry<String,Integer> entry =(Map.Entry<String, Integer>)it.next();
            System.out.println("单词 " + entry.getKey() + " 出现次数 : " + entry.getValue());
        }
 }




    /**
     * 初始化表格设置
     */
    private void initLineChart() {
        Line line =new Line(mPointValues).setColor(Color.BLUE);//将数据点填充到线上,并设置线的颜色为蓝色
        List<Line> lines = new ArrayList<Line>();          //创建了一个ArrayList对象;<>用于向参数化类
                                                           // 型传递参数;传递进入一个Line类型的变量作为参数,详细可见泛型
        // List是Collection接口的子接口 List有一个重要的实现类--ArrayList类,List中的元素是有序排列的而且可重复,所以被称为是序列。
        line.setShape(ValueShape.CIRCLE);                  //折线上每个数据点的形状,设置为圆形
        line.setCubic(false);                               //曲线是否圆滑
        line.setFilled(false);  //是否填充曲线的面积
        line.setHasLabels(true);//曲线的数据坐标是否加上备注
        line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效)
        line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示
        line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点)



        lines.add(line);//个人理解,将以上设置的 应用对象“line”的字段传给"lines"
        LineChartData data = new LineChartData();
        data.setLines(lines);//以上三行代码,均为导入折线的初始设置





        //坐标轴
        Axis axisX = new Axis();//创建X轴的引用变量
        Axis axisY = new Axis();//Y轴

        axisX.setName("道址数");
        axisY.setName("计数");

        data.setAxisXBottom(axisX);//X轴设置在底部
        data.setAxisYLeft(axisY);//Y轴设置在左侧



        //数据添加
        data.setBaseValue(Float.NEGATIVE_INFINITY);
        lineChart.setLineChartData(data);


        //设置平行缩放等行为属性
        lineChart.setInteractive(true);
        lineChart.setZoomType(ZoomType.HORIZONTAL_AND_VERTICAL);//水平跟垂直方向上的放大
        lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL);
        //上一行代码为设置水平方向可以滚动
        lineChart.setVisibility(View.VISIBLE);

        //动画效果
//         prepareDataAnimation();
        lineChart.startDataAnimation(1000);


    }



    /**
     * 图表的每个点的显示
     */
    private void getAxisPoints() {
        for (int i = 0; i < showdata.length; i++) {
            mPointValues.add(new PointValue(i, showdata[i]));
        }
    }

    /**
     * 设置X 轴的显示
     */
    private void getAxisXLables(){
        for (int i = 0; i < Xdate.length; i++) {
            mAxisXValues.add(new AxisValue(i).setLabel(Xdate[i]));
        }
    }



    public  String getString (InputStream inputStream) {
        InputStreamReader inputStreamReader = null;
        try {
            inputStreamReader = new InputStreamReader(inputStream, "gbk");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        }
        BufferedReader reader = new BufferedReader(inputStreamReader);   //创建一个输入流
        StringBuffer sb = new StringBuffer();
        String line;

        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line);
                sb.append("\n");


            }
        } catch (IOException e) {
            e.printStackTrace();

        }

        score=sb.toString();
        return  sb.toString();
    }
}


我使用的Android Studio版本是3.1.2,Gradle版本4.4,使用Android 8.0,华为mate8真机与模拟器都进行过测试。文件放在网盘:https://pan.baidu.com/s/114jzmu3mp5pvwGON3OlQVg

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
### 回答1: Android Studio实时曲线图是一种用于实时显示数据变化的图表,通常用于监控系统性能、传感器数据等。在Android Studio中,可以使用第三方库如MPAndroidChart来实现实时曲线图的绘制。该库提供了多种类型的图表,包括折线图、柱状图、饼图等,可以根据需求选择合适的类型。同时,该库还支持动画效果和交互操作,使得图表更加生动和易于使用。 ### 回答2: Android Studio是一个专业的Android开发平台,可以帮助开发者更快更轻松地开发Android应用程序,在其中实现实时曲线图是非常实用的功能。 要实现实时曲线图,开发者可以使用Android Studio提供的GraphView库,它是一个开源的图库,可以方便地实现曲线图、柱状图、折线图等各种图形的绘制。借助GraphView库,在Android平台上添加实时曲线图非常简单和方便。 首先需要在项目中添加GraphView库的引用(可以通过导入jar包或gradle构建方式),然后就可以开始使用GraphView库提供的API来实现实时曲线图。开发者需要通过定义曲线图的属性来控制曲线图的样式和行为,并通过定义Series对象来控制曲线图的数据流。通过贴近数据的实时绘制,可以实现动态、即时的曲线图展示。 实时曲线图对于许多应用程序来说都是非常重要的,例如汽车仪表盘、健康监测设备、数据采集等。在这些应用程序中,实时曲线图都扮演着重要的角色,能够帮助用户快速而准确地了解数据的变化情况。同时,通过Android Studio内置的开发调试工具,开发者可以更方便、更直观地调试实时曲线图的逻辑,帮助开发者更快地开发出沉浸式且有用的应用程序。 总之,Android Studio实时曲线图的实现相对容易,在大数据、测试、开发等多种场景中有着广泛的应用价,也常常被广泛用于跨平台的移动应用程序开发中。 ### 回答3: Android StudioAndroid应用程序开发过程中使用频率非常高的一款集成开发环境工具,其强大的功能和友好的界面受到了广大开发者的青睐。实时曲线图是Android开发中常用的一个功能,可以用来展示一些变化趋势的数据。Android Studio提供了几种方式来实现实时曲线图,下面我们就来详细了解一下。 1. 使用Google的MPAndroidChart库 Google的MPAndroidChart库是一款强大的图表绘制库,支持多种类型的图表,包括线性图、柱状图、饼状图等等。通过使用该库,我们可以轻松地实现实时曲线图的功能。 使用MPAndroidChart库实现实时曲线图的步骤如下: (1)在build.gradle文件中添加依赖 dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha' } (2)在布局文件中添加LineChart视图 <com.github.mikephil.charting.charts.LineChart android:id="@+id/chart" android:layout_width="match_parent" android:layout_height="match_parent" /> (3)在Java代码中配置曲线图属性并添加数据 LineChart lineChart = findViewById(R.id.chart); LineDataSet dataSet = new LineDataSet(entries, "Label"); dataSet.setColor(Color.rgb(255, 0, 0)); dataSet.setValueTextColor(Color.rgb(255, 0, 0)); LineData lineData = new LineData(dataSet); lineChart.setData(lineData); lineChart.invalidate(); 其中,entries为曲线图数据源,可以在每次更新数据时更新。 2. 使用SurfaceView和Canvas自定义绘制 除了使用第三方库,我们也可以通过自定义绘制实现实时曲线图。使用SurfaceView和Canvas可以让我们以最小的延迟呈现图形数据,提高绘制效率。 自定义绘制Android中非常常见,可以通过以下步骤实现: (1)创建SurfaceView public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private RenderThread mThread; public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); mHolder = getHolder(); mHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mThread = new RenderThread(holder); mThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { mThread.quit(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } private final class RenderThread extends Thread { private SurfaceHolder mHolder; private boolean mRunning = true; public RenderThread(SurfaceHolder holder) { mHolder = holder; } public void quit() { mRunning = false; } @Override public void run() { // 绘制逻辑 while (mRunning) { Canvas canvas = mHolder.lockCanvas(); if (canvas != null) { // 绘制曲线图 mHolder.unlockCanvasAndPost(canvas); } } } } } (2)在绘制线程中绘制曲线图 在RenderThread中,我们可以通过lockCanvas获取画布,然后通过Canvas绘制曲线图。为了实现实时曲线图,我们可以使用一个缓存数组存储曲线图的数据,每次更新数据后将其绘制到画布上即可。 总的来说,使用第三方库能够快速地实现实时曲线图,并且具有很好的图形效果和交互体验;而自定义绘制虽然需要编写更多的代码,但是能够更好地满足特定需求,并且绘制效率更高。开发者可以根据具体需要选择适合自己的方式来实现实时曲线图功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值