Android 三轴绘制实时加速度曲线

public class GsensorActivity extends Activity implements SensorEventListener {

    private static final String TAG = "GsensorActivity";
    private SensorManager mSensorManager;
    private Sensor mSensor;
    private TextView textviewX;
    private TextView textviewY;
    private TextView textviewZ;
    private TextView textviewF;

    private float mX, mY, mZ;
    private long lasttimestamp = 0;
    Calendar mCalendar;
    private GraphicalView chart;
    /** 曲线数量 */
    private static final int SERIES_NR = 1;
    private TimeSeries series1;
    private XYMultipleSeriesDataset dataset1;
    private float addY = -1;
    private long addX;
    /** 时间数据 */
    Date[] xcache = new Date[20];
    /** 数据 */
    float[] ycache = new float[20];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gsensor);
        textviewX = (TextView) findViewById(R.id.textView1);
        textviewY = (TextView) findViewById(R.id.textView3);
        textviewZ = (TextView) findViewById(R.id.textView4);
        textviewF = (TextView) findViewById(R.id.textView2);

        lasttimestamp = System.currentTimeMillis();

        LinearLayout layout = (LinearLayout) findViewById(R.id.linearlayout);
        // 生成图表
        chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(),
                getDemoRenderer(), "hh:mm:ss");
        layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, 380));

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// TYPE_GRAVITY
        if (null == mSensorManager) {
            Log.d(TAG, "deveice not support SensorManager");
        }
        // 参数三,检测的精准度
        mSensorManager.registerListener(this, mSensor,
                SensorManager.SENSOR_DELAY_NORMAL);// SENSOR_DELAY_GAME

    }

    private void updateChart(float a) {
        // 设定长度为20
        int length = series1.getItemCount();
        if (length >= 20)
            length = 20;
        addY = a;
        addX = new Date().getTime();

        // 将前面的点放入缓存
        for (int i = 0; i < length; i++) {
            xcache[i] = new Date((long) series1.getX(i));
            ycache[i] = (float) series1.getY(i);
        }
        series1.clear();
        series1.add(new Date(addX), addY);
        for (int k = 0; k < length; k++) {
            series1.add(xcache[k], ycache[k]);
        }
        // 在数据集中添加新的点集
        dataset1.removeSeries(series1);
        dataset1.addSeries(series1);
        // 曲线更新
        chart.invalidate();
    }

    /**
     * 设定如表样式
     *
     * @return
     */
    private XYMultipleSeriesRenderer getDemoRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setChartTitle("实时曲线");// 标题
        renderer.setChartTitleTextSize(20);
        renderer.setXTitle("时间"); // x轴说明
        renderer.setAxisTitleTextSize(16);
        renderer.setAxesColor(Color.BLACK);
        renderer.setLabelsTextSize(15); // 数轴刻度字体大小
        renderer.setLabelsColor(Color.BLACK);
        renderer.setLegendTextSize(15); // 曲线说明
        renderer.setXLabelsColor(Color.BLACK);
        renderer.setYLabelsColor(0, Color.BLACK);
        renderer.setShowLegend(false);
        renderer.setMargins(new int[] { 20, 30, 100, 0 });
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(Color.BLUE);
        r.setChartValuesTextSize(15);
        r.setChartValuesSpacing(3);
        r.setPointStyle(PointStyle.CIRCLE);
        r.setFillBelowLine(true);
        r.setFillBelowLineColor(Color.WHITE);
        r.setFillPoints(true);
        renderer.addSeriesRenderer(r);
        renderer.setMarginsColor(Color.WHITE);
        renderer.setPanEnabled(false, false);
        renderer.setShowGrid(true);
        renderer.setYAxisMax(50);
        renderer.setYAxisMin(-30);
        renderer.setInScroll(true); // 调整大小
        return renderer;
    }
    /**
     * 数据对象
     *
     * @return
     */
    private XYMultipleSeriesDataset getDateDemoDataset() {
        dataset1 = new XYMultipleSeriesDataset();
        final int nr = 10;
        long value = new Date().getTime();
        Random r = new Random();
        for (int i = 0; i < SERIES_NR; i++) {
            series1 = new TimeSeries("Demo series " + (i + 1));
            for (int k = 0; k < nr; k++) {
                series1.add(new Date(value + k * 1000), 0);
            }
            dataset1.addSeries(series1);
        }
        Log.i(TAG, dataset1.toString());
        return dataset1;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor == null) {
            return;
        }

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            float x =  event.values[0];
            float y =  event.values[1];
            float z =  event.values[2];
            mCalendar = Calendar.getInstance();
            long stamp = mCalendar.getTimeInMillis();// 1393844912

            textviewX.setText(String.valueOf(x));
            textviewY.setText(String.valueOf(y));
            textviewZ.setText(String.valueOf(z));

            int second = mCalendar.get(Calendar.SECOND);// 53

            float px = Math.abs(mX - x);
            float py = Math.abs(mY - y);
            float pz = Math.abs(mZ - z);
            Log.d(TAG, "pX:" + px + "  pY:" + py + "  pZ:" + pz + "    stamp:"
                    + stamp + "  second:" + second);
            float maxvalue = getMaxValue(px, py, pz);
            if (maxvalue > 2 && (stamp - lasttimestamp) > 200) {
                lasttimestamp = stamp;

                updateChart(x+y+z);

                textviewF.setText("检测手机在移动..");
            }

            mX = x;
            mY = y;
            mZ = z;

        }
    }

    /**
     * 获取一个最大值
     *
     * @param px
     * @param py
     * @param pz
     * @return
     */
    public float getMaxValue(float px, float py, float pz) {
        float max = 0;
        if (px > py && px > pz) {
            max = px;
        } else if (py > px && py > pz) {
            max = py;
        } else if (pz > px && pz > py) {
            max = pz;
        }

        return max;
    }
}
时间: 2024-10-24 18:52:56

Android 三轴绘制实时加速度曲线的相关文章

android 三轴加速度传感器【转】

一.手机中常用的传感器 在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用,具体如下:(Sensor类) #define SENSOR_TYPE_ACCELEROMETER 1 //加速度#define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力#define SENSOR_TYPE_ORIENTATION 3 //方向#define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪#define SENSOR_TY

Android视图View绘制流程与源码分析(全)

来源:[工匠若水 http://blog.csdn.net/yanbober] 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(

Android自定义控件 -Canvas绘制折线图(实现动态报表效果)

有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas绘制折线图.先看看绘制的效果: 代码: public class MyView extends View { //坐标轴原点的位置 private int xPoint=60; private int yPoint=260; //刻度长度 private int xScale=8;  //8个单位构

Android视图的绘制流程(下)——View的Layout与Draw过程

综述 在上篇文章中Android视图的绘制流程(上)--View的测量对View的Measure过程进行了详细的说明.对于在View的绘制的整个过程中,在对View的大小进行测量以后,便开始确定View的位置并且将其绘制到屏幕上.也就是View的Layout与Draw过程.那么就来看一下是如何实现这两个过程的. View的Layout过程 上文提到View的绘制流程是从ViewRoot的performTraversals方法开始,那么在View完成测量以后,在performTraversals方

我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘

几次想照着课本系统地学习Qt,但我发现还是有详细问题驱动时学习比較快. 于是我给自己设定了这个任务: 读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上. 这里面涉及到一些问题,接下来就用问答的形式记录一下. Q1: 搭建Ubuntu-BBB的Qt交叉编译环境.配置触摸屏: A1: http://blog.csdn.net/wyt2013/article/details/18549415 Q2: 去掉Qt界面的标题栏 A2: 在mainwindow.cpp中Mai

Android应用层View绘制流程与源码分析

Android应用层View绘制流程与源码分析 1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原理,记不记得最终分析结果就是下面的关系: 看见没有,如上图中id为content的内容就是整个View树的结构,所以对每个具体View对象的操作,其实就是个递归的实现. 前面<Android触摸屏事件派发机制详解与源码分析一(View篇)>文章的3-1

百度地图绘制实时路线以及最短线路规划

如何使用百度地图绘制实时路线以及最短线路规划 最近在做百度地图的实时路线绘制,发现一些问题,比如由于定位漂移带来的路线绘制偏差,还有由于定位漂移,导致人未走动时,也会绘制路线等.百度鹰眼的线路纠偏个人感觉很一般啊.而且有限漂移了两百米的点他也没有纠正过来.所以最后还是决定自己写一个纠偏吧.而且百度地图官方的dome和示例代码真的很示例啊.然人摸不着头脑.ok进入正题,思路是这样的,因为实时绘制线路都是在室外,所以只采用gps定位,不采用无线网络定位.这样漂移一两百米的点基本不会出现.第二当人在等

学习OpenGL(三)绘制螺旋状图形

学习OpenGL(三)绘制螺旋状图形 [email protected] http://blog.csdn.net/kezunhai 在OpenGl中,图形都是有一些基本的图元组成的,图元是把一组定点或顶点列表解释为屏幕上绘制的某些图形,OpenGL中的最小图元就是点.在OpenGL中有10中图元,可以实现从空间中绘制的简单的点到任意变数的封闭多边形,这十种图元分别是: 绘制图形的格式如下: glBegin("图元类型"); glVertex3f(GLfloat x, GLfloat

Android View的绘制流程

View 绘制机制 1. View 树的绘图流程 当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw.整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure).是否需要重新安置视图的位置(layout).以及是否需要重绘(draw),流程图如下: Vi