Android利用Achartengine实现实时曲线图

Android中LineChart设置曲线缩放比例 阅读详情

From:http://blog.youkuaiyun.com/lamelias/article/details/41894433

实时曲线图在实际项目中经常会遇到,特别是与传感器相关的项目中。也正是因为公司项目需要实时展现从BLE设备获取到的心电图数据,所以有机会对实时曲线图的实现过程进行了较深入的探究。本文会讲述两种实现方式,其中每种实现方式里都会包含两种展现方式(曲线图平移方向:左、右)。


假设可见视窗只能容纳下100个数据点,那么,在数据点个数超出一百后,如果不做任何处理的话,虽然数据已经绘制了,但我们看到的却一直都是前100个数据点,除非我们水平拖动坐标系。

第一种实现方式:

之前一直很困惑,为什么Achartengine没有像MPAndroidChart那样提供一个centerViewPort()方法,来指定在可见视窗中显示的点的X坐标值,后来发现,通过renderer.setXAxisMin()和renderer.setXAxisMax()即可控制需要在可见视窗中显示的点的范围,就好比我们可以水平移动X轴那样,在可见视窗中显示我们感兴趣的数据点。通过这种方式,每次添加数据时,我们都设置以下X坐标的最大最小值,使我们感兴趣的数据处于该范围内即可。同时,通过这种方式,如果我们水平拖动的话还可以看到所有的历史数据点。

第二种实现方式:

这种方式在于,每次新的数据点到来时,我们将所有的旧数据的X坐标加(减)1,新到来的数据点永远只在X坐标为0处显示,从而产生一种向右(左)平移的效果。这种方式我们无法看到所有的历史数据点,我们只能看到最近更新的100个数据点。

描述的有点抽象,还是看下具体的代码吧:

[java]  view plain  copy
  1. package com.lamelias.realtimechart;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Random;  
  5.   
  6. import org.achartengine.ChartFactory;  
  7. import org.achartengine.GraphicalView;  
  8. import org.achartengine.chart.PointStyle;  
  9. import org.achartengine.model.XYMultipleSeriesDataset;  
  10. import org.achartengine.model.XYSeries;  
  11. import org.achartengine.renderer.XYMultipleSeriesRenderer;  
  12. import org.achartengine.renderer.XYSeriesRenderer;  
  13.   
  14. import android.content.BroadcastReceiver;  
  15. import android.content.Context;  
  16. import android.content.Intent;  
  17. import android.content.IntentFilter;  
  18. import android.graphics.Color;  
  19. import android.graphics.Paint.Align;  
  20. import android.os.Bundle;  
  21. import android.os.Handler;  
  22. import android.os.Message;  
  23. import android.support.v4.app.Fragment;  
  24. import android.util.Log;  
  25. import android.view.LayoutInflater;  
  26. import android.view.View;  
  27. import android.view.ViewGroup;  
  28. import android.widget.RelativeLayout;  
  29. import android.widget.TextView;  
  30.   
  31. public class CardioChart extends Fragment {  
  32.   
  33.     private static String TAG = CardioChart.class.getSimpleName();  
  34.     private static final int MAX_POINT = 100;  
  35.     private TextView tv;  
  36.     /* 呼吸波形的相关参数 */  
  37.     int flagBreBt = 0;  
  38.     private Handler handler;  
  39.     private String title = "Cardiograph";  
  40.     private XYSeries series;  
  41.     private XYMultipleSeriesDataset mDataset;  
  42.     private GraphicalView chart;  
  43.     private XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();  
  44.     XYSeriesRenderer r = new XYSeriesRenderer();  
  45.     private Context context;  
  46.     private int addX = -1;  
  47.     int[] xv = new int[MAX_POINT];  
  48.     int[] yv = new int[MAX_POINT];  
  49.     RelativeLayout breathWave;  
  50.     int i = 0;  
  51.   
  52.     int count = 0;// 每隔多少包更新一次心电图  
  53.     private ArrayList<Integer> drawPack = new ArrayList<Integer>(); // 需要绘制的数据集  
  54.     Random random = new Random();  
  55.     private final int POINT_GENERATE_PERIOD=10; //单位是ms  
  56.       
  57.     Runnable runnable = new Runnable() {  
  58.   
  59.         @Override  
  60.         public void run() {  
  61.             ArrayList<Integer> datas = new ArrayList<Integer>();  
  62.             for (int i = 0; i < 1; i++) {  
  63.                 datas.add(random.nextInt(3000));  
  64.             }  
  65.               
  66.             /*以下方式左右拖动坐标系时可以看到所有历史数据点*/  
  67.             //updateCharts(datas);  
  68.             //leftUpdateCharts(datas);  
  69.               
  70.             /*以下方式无法看到历史数据点,在坐标轴上只能看到MAX_POINT个数据点*/  
  71.             updateChart(random.nextInt(3000));   
  72.             //rightUpdateChart(random.nextInt(3000));  
  73.               
  74.             handler.postDelayed(this, POINT_GENERATE_PERIOD);  
  75.         }  
  76.     };  
  77.   
  78.     @Override  
  79.     public void onCreate(Bundle savedInstanceState) {  
  80.         super.onCreate(savedInstanceState);  
  81.         handler = new Handler() ;  
  82.     }  
  83.   
  84.     @Override  
  85.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  86.             Bundle savedInstanceState) {  
  87.         View view = inflater.inflate(R.layout.cardiochart, container, false);  
  88.         breathWave = (RelativeLayout) view.findViewById(R.id.cardiograph);  
  89.         tv = (TextView) view.findViewById(R.id.test);  
  90.         initCardiograph();  
  91.   
  92.         return view;  
  93.     }  
  94.       
  95.     /** 
  96.      * @Title revcievedMessage  
  97.      * @Description Fragment接收Activity中消息的第一种方式,直接在Fragment中提供一个public方法,供Activity调用 
  98.      * @param action  
  99.      * @return void 
  100.      */  
  101.     public void recievedMessage(String action){  
  102.         switch(action){  
  103.         case "START" :  
  104.             handler.postDelayed(runnable, POINT_GENERATE_PERIOD);  
  105.             break;  
  106.         case "STOP" :  
  107.             Log.w(TAG, "recieved Stop !");  
  108.             handler.removeCallbacksAndMessages(null);  
  109.             break;  
  110.     }  
  111.     }  
  112.   
  113.     @Override  
  114.     public void onResume() {  
  115.         getActivity().registerReceiver(mBroadcastReceiver, makeIntentFilter());  
  116.         super.onResume();  
  117.     }  
  118.   
  119.     @Override  
  120.     public void onDestroy() {  
  121.         getActivity().unregisterReceiver(mBroadcastReceiver);  
  122.         super.onDestroy();  
  123.     }  
  124.       
  125.     /** 
  126.      * @Title makeIntentFilter  
  127.      * @Description  Fragment接收Activity中消息的第二种方式,通过广播的方式 
  128.      * @return  
  129.      * @return IntentFilter 
  130.      */  
  131.     private IntentFilter makeIntentFilter() {  
  132.         IntentFilter mIntentFilter=new IntentFilter();  
  133.         mIntentFilter.addAction("START");  
  134.         mIntentFilter.addAction("STOP");  
  135.         return mIntentFilter;  
  136.     }  
  137.       
  138.     private BroadcastReceiver mBroadcastReceiver=new BroadcastReceiver() {  
  139.           
  140.         @Override  
  141.         public void onReceive(Context context, Intent intent) {  
  142.             switch(intent.getAction()){  
  143.                 case "START" :  
  144.                     handler.postDelayed(runnable, POINT_GENERATE_PERIOD);  
  145.                     break;  
  146.                 case "STOP" :  
  147.                     Log.w(TAG, "recieved Stop !");  
  148.                     handler.removeCallbacksAndMessages(null);  
  149.                     break;  
  150.             }  
  151.               
  152.         }  
  153.     };  
  154.   
  155.       
  156.   
  157.     public void initCardiograph() {  
  158.         context = getActivity().getApplicationContext();  
  159.         // 这个类用来放置曲线上的所有点,是一个点的集合,根据这些点画出曲线  
  160.         series = new XYSeries(title);  
  161.         // 创建一个数据集的实例,这个数据集将被用来创建图表  
  162.         mDataset = new XYMultipleSeriesDataset();  
  163.         // 将点集添加到这个数据集中  
  164.         mDataset.addSeries(series);  
  165.         // 以下都是曲线的样式和属性等等的设置,renderer相当于一个用来给图表做渲染的句柄  
  166.         /* int color = Color.parseColor("#08145e"); */  
  167.         int color = getResources().getColor(R.color.cardio_color3);  
  168.         PointStyle style = PointStyle.CIRCLE;  
  169.         buildRenderer(color, style, true);  
  170.         // 设置好图表的样式  
  171.         setChartSettings(renderer, "X", "Y", 0, MAX_POINT, 0, 3000, color,  
  172.                 color);  
  173.         // 生成图表  
  174.         chart = ChartFactory.getLineChartView(context, mDataset, renderer);  
  175.         chart.setBackgroundColor(getResources().getColor(  
  176.                 R.color.cardio_bg_color));  
  177.         breathWave.removeAllViews();  
  178.         breathWave.addView(chart);  
  179.   
  180.     }  
  181.   
  182.     protected void buildRenderer(int color, PointStyle style, boolean fill) {  
  183.   
  184.         // 设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等  
  185.         r.setColor(color);  
  186.         r.setPointStyle(style);  
  187.         r.setFillPoints(fill);  
  188.         r.setLineWidth(3);  
  189.         renderer.addSeriesRenderer(r);  
  190.     }  
  191.   
  192.     protected void setChartSettings(XYMultipleSeriesRenderer renderer,  
  193.             String xTitle, String yTitle, double xMin, double xMax,  
  194.             double yMin, double yMax, int axesColor, int labelsColor) {  
  195.         // 有关对图表的渲染可参看api文档  
  196.         renderer.setBackgroundColor(getResources().getColor(  
  197.                 R.color.cardio_bg_color));  
  198.         renderer.setChartTitle(title);  
  199.         renderer.setChartTitleTextSize(20);  
  200.         renderer.setLabelsTextSize(19);// 设置坐标轴标签文字的大小  
  201.         renderer.setXTitle(xTitle);  
  202.         renderer.setYTitle(yTitle);  
  203.         renderer.setXAxisMin(xMin);  
  204.         renderer.setXAxisMax(xMax);  
  205.         renderer.setYAxisMin(yMin);  
  206.         renderer.setYAxisMax(yMax);  
  207.         //renderer.setYAxisAlign(Align.RIGHT, 0);//用来调整Y轴放置的位置,表示将第一条Y轴放在右侧  
  208.         renderer.setAxesColor(axesColor);  
  209.         renderer.setLabelsColor(labelsColor);  
  210.         renderer.setShowGrid(true);  
  211.         renderer.setGridColor(Color.GRAY);  
  212.         renderer.setXLabels(10);//若不想显示X标签刻度,设置为0 即可  
  213.         renderer.setYLabels(10);  
  214.         renderer.setLabelsTextSize(18);// 设置坐标轴标签文字的大小  
  215.         renderer.setXLabelsColor(labelsColor);  
  216.         renderer.setYLabelsColor(0, labelsColor);  
  217.         renderer.setYLabelsVerticalPadding(-5);  
  218.         renderer.setXTitle("");  
  219.         renderer.setYTitle("");  
  220.         renderer.setYLabelsAlign(Align.RIGHT);  
  221.         renderer.setAxisTitleTextSize(20);  
  222.         renderer.setPointSize((float) 1);  
  223.         renderer.setShowLegend(false);  
  224.         renderer.setFitLegend(true);  
  225.         renderer.setMargins(new int[] { 30, 45, 10, 20 });// 设置图表的外边框(上/左/下/右)  
  226.         renderer.setMarginsColor(getResources().getColor(  
  227.                 R.color.cardio_bg_color));  
  228.     }  
  229.       
  230.   
  231.     /** 
  232.      * @Title leftUpdateCharts  
  233.      * @Description 新生成的点一直在左侧,产生向右平移的效果, 基于X轴坐标从0开始,然后递减的思想处理 
  234.      * @param datas  
  235.      * @return void 
  236.      */  
  237.     protected void  leftUpdateCharts(ArrayList<Integer> datas) {  
  238.         for (int addY : datas) {  
  239.             series.add(i, addY);  
  240.             i--;  
  241.         }  
  242.         if (Math.abs(i) < MAX_POINT) {  
  243.             renderer.setXAxisMin(-MAX_POINT);  
  244.             renderer.setXAxisMax(0);  
  245.         } else {  
  246.             renderer.setXAxisMin(-series.getItemCount());  
  247.             renderer.setXAxisMax(-series.getItemCount() + MAX_POINT);  
  248.         }  
  249.   
  250.         chart.repaint();  
  251.     }  
  252.       
  253.     /** 
  254.      * @Title updateCharts  
  255.      * @Description 新生成的点一直在右侧,产生向左平移的效果,基于X轴坐标从0开始,然后递加的思想处理 
  256.      * @param datas  
  257.      * @return void 
  258.      */  
  259.     protected void updateCharts(ArrayList<Integer> datas) {  
  260.         for (int addY : datas) {  
  261.             series.add(i, addY);  
  262.             i++;  
  263.         }  
  264.         if (i < MAX_POINT) {  
  265.             renderer.setXAxisMin(0);  
  266.             renderer.setXAxisMax(MAX_POINT);  
  267.         } else {  
  268.             renderer.setXAxisMin(series.getItemCount() - MAX_POINT);  
  269.             renderer.setXAxisMax(series.getItemCount());  
  270.         }  
  271.   
  272.         chart.repaint();  
  273.     }  
  274.   
  275.     /** 
  276.      * @Title updateChart  
  277.      * @Description 新生成的点一直在x坐标为0处,因为将所有旧点的x坐标值加1,所以产生向右平移的效果 
  278.      * @param addY  
  279.      * @return void 
  280.      */  
  281.     private void updateChart(int addY) {  
  282.   
  283.         // 设置好下一个需要增加的节点   
  284.         addX = 0;   
  285.         // 移除数据集中旧的点集  
  286.         mDataset.removeSeries(series);  
  287.         // 判断当前点集中到底有多少点,因为屏幕总共只能容纳MAX_POINT个,所以当点数超过MAX_POINT时,长度永远是MAX_POINT  
  288.         int length = series.getItemCount();  
  289.         if (length > MAX_POINT) {  
  290.             length = MAX_POINT;  
  291.         }  
  292.         // 将旧的点集中x和y的数值取出来放入backup中,并且将x的值加1,造成曲线向右平移的效果  
  293.         for (int i = 0; i < length; i++) {  
  294.             xv[i] = (int) series.getX(i) + 1;  
  295.             yv[i] = (int) series.getY(i);  
  296.         }  
  297.         // 点集先清空,为了做成新的点集而准备   
  298.         series.clear();  
  299.         // 将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中  
  300.         // 这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点  
  301.         series.add(addX, addY);  
  302.         for (int k = 0; k < length; k++) {  
  303.             series.add(xv[k], yv[k]);  
  304.         }  
  305.   
  306.         // 在数据集中添加新的点集  
  307.         mDataset.addSeries(series);   
  308.         // 视图更新,没有这一步,曲线不会呈现动态  
  309.         // 如果在非UI主线程中,需要调用postInvalidate(),具体参考api   
  310.         //chart.invalidate();  
  311.         chart.repaint();  
  312.     }  
  313.       
  314.     /** 
  315.      * @Title rightUpdateChart  
  316.      * @Description 新生成的点一直在x坐标为MAX_POINT处,因为将所有旧点的x坐标值减1,所以产生向左平移的效果,无法看到历史数据点 
  317.      * @param addY  
  318.      * @return void 
  319.      */  
  320.     private void rightUpdateChart(int addY) {  
  321.   
  322.         // 设置好下一个需要增加的节点   
  323.         addX =MAX_POINT;   
  324.         // 移除数据集中旧的点集  
  325.         mDataset.removeSeries(series);  
  326.         // 判断当前点集中到底有多少点,因为屏幕总共只能容纳MAX_POINT个,所以当点数超过MAX_POINT时,长度永远是MAX_POINT  
  327.         int length = series.getItemCount();  
  328.         if (length > MAX_POINT) {  
  329.             length = MAX_POINT;  
  330.         }  
  331.         // 将旧的点集中x和y的数值取出来放入backup中,并且将x的值-1,造成曲线向左平移的效果  
  332.         for (int i = 0; i < length; i++) {  
  333.             xv[i] = (int) series.getX(i) - 1;  
  334.             yv[i] = (int) series.getY(i);  
  335.         }  
  336.         // 点集先清空,为了做成新的点集而准备   
  337.         series.clear();  
  338.         // 将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中  
  339.         // 这里可以试验一下把顺序颠倒过来是什么效果,即先运行循环体,再添加新产生的点  
  340.         series.add(addX, addY);  
  341.         for (int k = 0; k < length; k++) {  
  342.             series.add(xv[k], yv[k]);  
  343.         }  
  344.   
  345.         // 在数据集中添加新的点集  
  346.         mDataset.addSeries(series);   
  347.         // 视图更新,没有这一步,曲线不会呈现动态  
  348.         // 如果在非UI主线程中,需要调用postInvalidate(),具体参考api   
  349.         //chart.invalidate();  
  350.         chart.repaint();  
  351.     }  
  352. }  


完整的工程已上传至优快云,为便于展示,将实际项目里获取到的心电图数据修改成随机数数据,详见以下链接: http://download.youkuaiyun.com/detail/lamelias/8251705

使用时请先导入Android-support-V7-appcompat,然后再导入RealTimeChart,二者导入完毕后。注意修改一下Library引用,方法如下:右击RealTimeChart工程,选择Properties->Android->下方Library->add->选择android-support-V7-appcompat即可。




Android 给AChartEngine绘制的曲线图加渐变色(修改AChartEngine源码) AChartEngine是一个安卓的图标框架,支持各种图标。以下说的针对曲线图。 百度一通没发现,然后在http://stackoverflow.com/questions/16140546/android-fill-color-below-the-line-chart 上看到有人贴出效果图:,但代码里面说的我没搞懂。 然后用了另一种思维方式,在图标view的上面加一层渐变色的vie 阅读详情

相关推荐

AChartEngine实现Android实时时间变化曲线

话不多说先看效果图 参考https://blog.youkuaiyun.com/s_best1987/article/details/8946759# AChartEngine给我们提供了GraphicalView这个类,可以灵活的在任何位置插入图表,非常的方便。 下面对相关类进行讲解: GraphicalView:图表控件,是一个基本类,也是一个容器控件,所有的图表都在此控件中呈现;...

Android_QQ250801529 1037

安卓图表引擎AChartEngine(一) - 简介

AChartEngine是一个安卓系统上制作图表的框架,目前它支持如下的图表类型: line chart (折线图) area chart (面积图;分区图,对比图) scatter chart (散点图) time chart (时间图;进度表) bar chart (条形图;柱状图) pie chart (饼图) bubble chart (气泡图) doughn...

239

修改AChartEngine支持多条Y轴曲线图

因为项目需要,需要曲线图能够支持多个Y轴,查阅Demo,发现Temprature and Shnshine能够支持双Y轴,研究了以下代码,发现可以支持多个Y轴。代码如下: /** * Copyright (C) 2009 - 2013 SC 4ViewSoft SRL * * Licensed under the Apache License, Version 2.0 (the "Li

fanshuangquan的专栏 1187

Android图表教程:AChartEngine

在这篇文章中,我将描述如何使用AchartEngine 。 这是一个很棒的Android库,可帮助您创建图表。 它支持多种图表类型,仅举几例: 折线图 面积图 条形图 饼形图 组合图 等等。 创建图表时,该库可在各个方面为您提供帮助,因此您无需其他任何东西即可创建有趣的图表。 入门 如果您使用Android Studio,则可以直接下载包含所有类的jar并...

1337

Android Studio中使用Achartengine绘制实时传感器数据曲线指南

Achartengine是一个开源的Android图表绘制库,允许开发者在Android应用中快速实现各种图表的展示。它支持包括折线图、柱状图、饼图、散点图等多种图表类型,并且提供了丰富的自定义选项,让图表更加符合应用的UI/UX设计要求。Achartengine还支持图表的交互操作,如拖动、缩放等,使得用户体验更加友好。Android的传感器系统建立在一系列的抽象层之上,这些层次结构使得应用程序能够以统一的方式访问各类硬件传感器,而不必直接与硬件打交道。

weixin_34640289的博客 1242

android 实时曲线图

利用achartengine实现的实时曲线图,其中有两种实现方式(含四种表现方式),使用时请先将android-support-v7-appcompat导入,然后导入RealTimeChart,导入完成后,修改Library引用,方法如下:右击RealTimeChart工程文件,选择Properties->Android :Library->add->android-support-v7-appcompat,即可成功运行

achartengine画出动态折线图

achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目时间上也不允许,虽然这个画图引擎比较简单,不过勉强够用了。下一步问题就来了,我仓促上手,只会画静态图,就是事先定义好几个坐标,然后activity载入的时候折线就已经画好了,可是我的项目要求我每隔一秒...

weixin_33786077的博客 116

Android实时曲线

Android实时曲线,等分Y轴,动态实时坐标点数据

achartengine画出动态折线图的效果

最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目时间上也不允许,虽然这个画图引擎比较简单,不过勉强够用了。 下一步问题就来了,我仓促上手,只会画静态图,就是事先定义好几个坐标,然后activity载入的时候折线就已经画好了,可是我的项目要求我每隔一秒种都要把新搜集到的数据添加到图表中去...

jingwenjingwen的专栏 150

Android报表库aChartEngine 横轴为时间曲线图表

主要是aChartEngine 图表中线性图表的time chart的使用,以时间为x轴单位,可以自由的设置单位为年 月 日 时 分 秒等,可以自由的设置间隔大小

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 429

Android柱状图动态显示,android cchartengine有8条曲线动态显示,只有1条曲线在动

importjava.util.Timer;importjava.util.TimerTask;importorg.achartengine.ChartFactory;importorg.achartengine.GraphicalView;importorg.achartengine.chart.PointStyle;importorg.achartengine.model.XYMu...

weixin_39639505的博客 196

告别Selenium!纯Python+Requests搞定微信视频号登录Cookie(附完整代码与避坑指南)

本文详细介绍了如何利用纯Python和Requests库实现微信视频号的自动化登录,替代传统的Selenium方案。通过解析HTTP请求交互流程,提供完整的代码实现和避坑指南,显著提升爬虫效率和隐蔽性,适用于轻量化爬虫开发。

weixin_30642561的博客 310

AChartEngine应用之LineChart(模拟动态生命特征值图)

AChartEngine应用之LineChart(模拟动态生命特征值图) 接着上一次写的内容,构建动态曲线图,并产生与用户交互,考虑到数据都是活动的,不可能总是用静态数据,所以我下面的demo就是模拟。项目作用:模拟生命特征值图,动态显示分钟脉搏生命特征值走向每隔1000ms产生50组数据,并填充到表格中,主要使用的到是Handler+Task,因为我是用Activity显示这个表格每次产生的数...

Stop Tears 105

微信自动化必备软件:inspect(获取微信界面元素)

SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。

Ven%的博客 1381

离线语音识别模块LD3320实战:如何低成本给STM32设备加上‘耳朵’和‘嘴巴’?

本文详细介绍了如何为STM32设备集成LD3320离线语音识别模块,实现低成本语音交互方案。从硬件连接到STM32底层驱动实现,再到指令训练与词条优化技巧,完整解析了唤醒词检测与自定义指令识别的全过程。LD3320作为非特定人声识别芯片,无需网络连接,适用于智能家居、工业控制等场景,是嵌入式开发者的理想选择。

weixin_30906185的博客 555

android自定义achartengine,AChartEngine实现Android实时时间变化曲线

话不多说先看效果图AChartEngine给我们提供了GraphicalView这个类,可以灵活的在任何位置插入图表,非常的方便。下面对相关类进行讲解:GraphicalView:图表控件,是一个基本类,也是一个容器控件,所有的图表都在此控件中呈现;ChartFactory:工厂类,通过此类来构建不同的图表对象,比如LineChart(折线图)、CubeLineChart(圆滑折线图)、PieCh...

weixin_29108051的博客 329

halcon3d点云补全方法

属于halcon实例中的内容,后面还接了一部分的匹配

Tianwen_running的博客 1230

Android开发进阶系列(十) 玩转AChartEngine专题(下)

第二个项目是电力数据实时监测相关的,数据就不是从本机上读取了,而是连接到服务器与后台数据库交互。下面是三个界面对应的三种不同的显示需求:1. 实时往前推的柱状图初始化代码: //画曲线 private View InitRenderer() { /* achartengine-1.1.0 * */ //

日西月东的专栏 2299

PCL RANSAC采样一致性算法

一直想了解一下RANSAC算法的一些原理,所以就趁着自己闲了下来整理了一下,做了这篇笔记。 文章目录一、简介二、PCL中的RANSAC 一、简介 RANSAC是一种随机参数估计算法。RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,再使用一个预先设定好的阈值与偏差比较,当偏差小于阈值时,该样本点属于模型内样本点(内点),否则就是外样本点(外点)。记录当前的内点的个数,然后重复上述的过程,直到模型中的内点达到最多,那么此时的模型参数即为最

dayuhaitang1的博客 2115

基于STC8G1K08A单片机的EC11旋转编码器控制(江科大同款,代码可直接使用)

本文介绍了STC8G系列单片机与EC11旋转编码器的接口实现方案。硬件方面详细说明了EC11编码器的机械结构、电气特性及与单片机的典型连接电路,包括上拉电阻和消抖设计。软件部分重点阐述了状态检测算法,通过状态机和查找表实现方向判断,采用中断方式检测信号变化,并配合定时器进行软件消抖处理。文章还提供了完整的代码实现,包括GPIO初始化、中断服务函数、状态转换逻辑等关键模块,展示了如何通过串口输出验证旋转计数。最后讨论了抗抖动优化、高低速应用场景等实际问题解决方案。该方案在菜单导航、参数调节等场景中具有实用价值

weixin_74013772的博客 321

Android开发 绘制曲线图 AchartEngine使用

1.首先在布局文件中加入LinearLayout布局,如下: <LinearLayout android:id="@+id/chart" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:

w575822446的专栏 3423

FineReport FCP模拟题五

新建决策报表,设置 移动端 格式,采用绝对布局。数据来源:FRDemo中的订单表/雇员表。

Davina_yu的博客 723

使用Achartengine做平滑曲线图和温度显示柱状图

详细注解代码里面有,就不一一说明了,说下需要注意的事项: renderer.setPanEnabled(true, false);// 设置横坐标可以滑动,纵坐标不可以 renderer.setZoomEnabled(false, false);// 直接设置setZoomEnabled(false);不管用 关键代码: 圆滑单曲线: /** * 圆滑

u010411826的专栏 4102

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android 实时曲线图/折线图

基于开源框架AChartEnginee绘制图表表格,实现显示数据折线图,对比功能。效果图如下: 新建工程 通过Android studio新建项目,添加achartenginee.jar依赖。点击下载jar 初始化图表 数据集 根据需求设置多条曲线,一条曲线对应一个XYSeries实例 series = new XYSeries(title); series2 =

风晴 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 监听按钮的点击事件
下一篇: ffmpeg库音频解码示例(转载)
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值