您现在的位置是:群英 > 开发技术 > 编程语言
Socket通信动态折线图的使用方法
Admin发表于 2022-04-26 14:23:25815 次浏览
在实际案例的操作过程中,我们可能会遇到“Socket通信动态折线图的使用方法”这样的问题,那么我们该如何处理和解决这样的情况呢?这篇小编就给大家总结了一些方法,具有一定的借鉴价值,希望对大家有所帮助,接下来就让小编带领大家一起了解看看吧。

项目里需要App端不断地从服务器获取数据,实时生成图表。在线程一个线程中不断的从服务器获取数据,然后在Handler中更新界面,每获取一个数据发送一个Message,Handler收到Message之后更新折线图。图表控件使用的是MPAndroidChart。自己写了一个实时更新折线图的工具类。希望有需要的盆友可以直接拿走使用。


1、实时折线图工具类

import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

import java.util.ArrayList;
import java.util.List;

public class ChartUtils {

    private LineChart lineChart;
    private LineData mLineData;
    private List<Entry> lineList = new ArrayList<>();
    private List<String> xData = new ArrayList<>();


    public void initStateChart(LineChart chart) {
        lineChart = chart;
        lineChart.setBackgroundColor(Color.rgb(255, 255, 255));
        // 不可以缩放
        lineChart.setScaleEnabled(false);

        //启用或禁用描述
        Description description = lineChart.getDescription();
        description.setEnabled(false);

        //新建空数据
        LineDataSet dataSet = new LineDataSet(lineList, "设备波形图");
        //线条颜色
        dataSet.setColor(Color.parseColor("#60B0F2"));
        //圆点颜色
        dataSet.setCircleColor(Color.parseColor("#60B0F2"));
        dataSet.setCircleRadius(1.5f);
        dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        dataSet.setFillColor(Color.parseColor("#60B0F2"));
        dataSet.setFillAlpha(50);
        //线条宽度
        dataSet.setLineWidth(1f);

        //设置x轴、y轴样式
        YAxis rightAxis = lineChart.getAxisRight();
        YAxis leftAxis = lineChart.getAxisLeft();
        //保证Y轴从0开始,不然会上移一点
        leftAxis.setAxisMinimum(0f);
        rightAxis.setAxisMinimum(300f);
        //设置图表右边的y轴禁用
        rightAxis.setEnabled(false);
        //设置图表左边的y轴禁用
        //设置x轴
        XAxis xAxis = lineChart.getXAxis();
        xAxis.setTextColor(Color.parseColor("#333333"));
        xAxis.setTextSize(11f);
        xAxis.setAxisMinimum(0f);
        //是否绘制轴线
        xAxis.setDrawAxisLine(true);
        //设置x轴上每个点对应的线
        xAxis.setDrawGridLines(true);
        //绘制标签  指x轴上的对应数值
        xAxis.setDrawLabels(true);
        //设置x轴的显示位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        //禁止放大后x轴标签重绘
        xAxis.setGranularity(1f);
        //自定义x轴值
        xAxis.setValueFormatter(LineXiavf0);
        //图表将避免第一个和最后一个标签条目被减掉在图表或屏幕的边缘
        xAxis.setAvoidFirstLastClipping(true);

        Legend l = lineChart.getLegend();
        l.setForm(Legend.LegendForm.LINE);
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);

        //chart设置数据
        mLineData = new LineData(dataSet);
        //是否绘制线条上的文字
        mLineData.setDrawValues(true);

        lineChart.setData(mLineData);
        lineChart.animateX(500);
        lineChart.setNoDataText("暂无数据");
        lineChart.invalidate();
    }

    //自定义x轴值
    private IAxisValueFormatter LineXiavf0 = new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            int p = (int) value;
            if (p < xData.size() && p > -1) {
                return xData.get(p);
            } else {
                return "";
            }
        }
    };

    //添加数据
    public void addEntry(String xValue, int yValue) {
        //添加x轴值
        xData.add(xValue);
        //添加y轴值
        Entry entry = new Entry(xData.size(), yValue);
        mLineData.addEntry(entry, 0);
        //数据刷新
        mLineData.notifyDataChanged();
        //char图标刷新
        lineChart.notifyDataSetChanged();
        //x轴显示最大个数
        lineChart.setVisibleXRangeMaximum(20);
        //x轴移动
        lineChart.moveViewToAnimated(xData.size(), 0, YAxis.AxisDependency.RIGHT, 75);
    }

}


2、通过Socket获取后台发送的数据

public class TcpSocketAsyncTask extends AsyncTask<Void, Void, String> {

    private String ip;
    private String port;

    public TcpSocketAsyncTask(String ip, String port) {
        this.ip = ip;
        this.port = port;
    }

    @Override
    protected String doInBackground(Void... param) {

        try {
            socket = new Socket(ip, Integer.parseInt(port));
            InputStream inputStream = socket.getInputStream();
            DataInputStream input = new DataInputStream(inputStream);
            byte[] b = new byte[10000];
            while (true) {
                int length = input.read(b);
                String msg = new String(b, 0, length);
                Message message = new Message();
                message.obj = msg;
                mHandler.sendMessage(message);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Message message = new Message();
            message.obj = ip   ":"   port   "Socket连接异常";
            mHandler.sendMessage(message);
        }
        return "";
    }

}


3、Message配合Handler实现

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        try {
            String cussStr = "".equals(mResultTextview.getText().toString()) ? "" : mResultTextview.getText().toString()   "
";
            mResultTextview.setText(cussStr   msg.obj.toString());

            //要在java代码中设置滚动的方法:
            mResultTextview.setMovementMethod(ScrollingMovementMethod.getInstance());
            //下面是设置显示最新的内容:
            mResultTextview.setSelection(mResultTextview.getText().length(), mResultTextview.getText().length());

            int valueTen2 = Integer.parseInt(msg.obj.toString());
            Log.v("Socket 接收数据==========", msg.obj.toString()   ",十进制数据: "   valueTen2);
            mChartUtils.addEntry("", valueTen2);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

};


另外我们在使用MPAndroidChart的时候,需要先导包哦,implementation ´com.github.PhilJay:MPAndroidChart:v3.1.0-alpha´,通过这句代码就可以导入了,然后在界面上引入一个com.github.mikephil.charting.charts.LineChart的View就可以了


关于“Socket通信动态折线图的使用方法”的内容就介绍到这,感谢各位的阅读,相信大家对Socket通信动态折线图的使用方法已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-12-09 17:50:23 
摘要:4种方法:1、用ltrim()去除字符串左侧的回车符,语法“ltrim(字符串)”;2、用rtrim()去除字符串右侧的回车符,语法“rtrim(字符串)”;3、用trim()去除字符串两侧的回车符,语法“trim(字符串)”;4、用preg_replace()配合正则表达式来去除全部回车符,语法“preg_replace('/\r|\n/','',字符串)”。
2022-07-30 17:36:43 
摘要:PHP数组下标不是只能从0开始;PHP中数组的下标默认是从0开始的,但并不是全部都是0开始,可以特别指定数组的下标,PHP会根据指定的下标进行自增,语法为“$array = array(指定下标=>"第一个元素","第二个元素"...)”。
2022-05-09 17:40:33 
摘要:bootstrap有日历控件即时间日期日历控件,名称为“datetimepicker”,是一个Bootstrap组件,能够简化页面上日期、时间的输入。
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部