链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/29/2373420.html

一、概述

Android支持的传感器种类越来越多了,这确实是一件可喜的事情,两年前在单片机上玩过加速度传感器模块,当时做的是一个摔倒检测的项目,利用相关的算法对三轴数据进行采集、处理、判断来实现检测,既然是摔倒检测,那肯定是一个便携式设备吧,没错,当时做出来的设备是小到可以放进口袋里的。庆幸的是,今天这些东西完全可以在手机上完成了,而且不用涉及到硬件设计的问题,不过今天不是讲如何去移植那个项目,而是讲讲Android上的传感器编程。Android,再一次让我看到你的强大!再一次坚定了我学习你的信心!

二、要求

了解、熟悉传感器的编程方法。

三、实现

新建工程MySensor,修改/res/layout/main.xml文件,在里面添加一个SurfaceView,完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <SurfaceView
8 android:id="@+id/surfaceview"
9 android:layout_width="fill_parent"
10 android:layout_height="180dip"
11 />
12
13
14 </LinearLayout>

接着,修改MySensorActivity.java文件,代码中有详细注释,完整的MySensorActivity.java文件如下:

  1 package com.nan.sensor;
2
3 import android.app.Activity;
4 import android.graphics.Canvas;
5 import android.graphics.Color;
6 import android.graphics.Paint;
7 import android.graphics.Rect;
8 import android.hardware.Sensor;
9 import android.hardware.SensorEvent;
10 import android.hardware.SensorEventListener;
11 import android.hardware.SensorManager;
12 import android.os.Bundle;
13 import android.view.SurfaceHolder;
14 import android.view.SurfaceView;
15
16 public class MySensorActivity extends Activity
17 {
18 private float acceValusX = 0f;
19 private float acceValusY = 0f;
20 private float acceValusZ = 0f;
21 private int x = 0;
22
23 private SurfaceView mSurfaceView = null;
24 private SurfaceHolder mSurfaceHolder = null;
25 private Paint mPaint = null;
26
27 private SensorManager mSensorManager;
28 private Sensor mAccelerometer;
29 private OnSensorEventListener mOnSensorEventListener = new OnSensorEventListener();
30
31 /** Called when the activity is first created. */
32 @Override
33 public void onCreate(Bundle savedInstanceState)
34
35 {
36 super.onCreate(savedInstanceState);
37 setContentView(R.layout.main);
38
39 mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
40 mSurfaceHolder = mSurfaceView.getHolder();
41 mSurfaceHolder.addCallback(new MyHolder());
42
43 mPaint = new Paint();
44 //画笔的粗细
45 mPaint.setStrokeWidth(1.0f);
46 //从系统服务中获得传感器管服务
47 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
48 mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
49 //注册传感器监听
50 mSensorManager.registerListener(mOnSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
51 }
52
53
54 private class OnSensorEventListener implements SensorEventListener
55 {
56
57 @Override
58 public void onAccuracyChanged(Sensor sensor, int accuracy)
59 {
60 // TODO Auto-generated method stub
61
62 }
63
64 @Override
65 public void onSensorChanged(SensorEvent event)
66 {
67 // TODO Auto-generated method stub
68
69 //获得x轴的值
70 acceValusX = event.values[0];
71 //获得y轴的值
72 acceValusY = event.values[1];
73 //获得z轴的值
74 acceValusZ = event.values[2];
75
76 //锁定整个SurfaceView
77 Canvas mCanvas = mSurfaceHolder.lockCanvas();
78 try
79 {
80 if(mCanvas!=null)
81 {
82 //画笔的颜色(红)
83 mPaint.setColor(Color.RED);
84 //画X轴的点
85 mCanvas.drawPoint(x, (int)(30 + acceValusX), mPaint);
86 //画笔的颜色(绿)
87 mPaint.setColor(Color.GREEN);
88 //画Y轴的点
89 mCanvas.drawPoint(x, (int)(60 + acceValusY), mPaint);
90 //画笔的颜色(蓝)
91 mPaint.setColor(Color.BLUE);
92 //画Z轴的点
93 mCanvas.drawPoint(x, (int)(90 + acceValusZ), mPaint);
94 //横坐标+1
95 x++;
96 //如果已经画到了屏幕的最右边
97 if(x > getWindowManager().getDefaultDisplay().getWidth())
98 {
99 x = 0;
100 //清屏
101 mCanvas.drawColor(Color.BLACK);
102 }
103 //绘制完成,提交修改
104 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
105 }
106 }
107 catch(Exception e)
108 {
109 e.printStackTrace();
110 }
111 finally
112 {
113 if(mCanvas!=null)
114 {
115 //重新锁一次
116 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
117 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
118 }
119 }
120
121 }
122
123 }
124
125
126 //定义一个类,实现Callback接口
127 public class MyHolder implements SurfaceHolder.Callback
128 {
129
130 public void surfaceChanged(SurfaceHolder holder, int format, int width,
131 int height)
132 {
133 // TODO Auto-generated method stub
134 //add your code
135 }
136
137 public void surfaceCreated(SurfaceHolder holder)
138 {
139 // TODO Auto-generated method stub
140 //add your code
141 }
142
143 public void surfaceDestroyed(SurfaceHolder holder)
144 {
145 // TODO Auto-generated method stub
146 //add your code
147 }
148
149 }
150
151 @Override
152 public void onDestroy()
153 {
154 super.onDestroy();
155 //注销传感器监听
156 mSensorManager.unregisterListener(mOnSensorEventListener, mAccelerometer);
157 }
158
159 }

好了,在真机上运行它,效果如下:

晃动手机几下,效果如下:

完成。

Android应用开发提高篇(3)-----传感器(Sensor)编程的更多相关文章

  1. Android应用开发提高篇(1)-----获取本地IP

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...

  2. Android JNI开发提高篇

    有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...

  3. Android应用开发提高篇(6)-----FaceDetector(人脸检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html 一.概述 初次看到FaceDetector这个类时,心里想:And ...

  4. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...

  5. Android应用开发提高篇(5)-----Camera使用

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部 ...

  6. Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html 一.概述 TextToSpeech,就是将文本内容转换成语音,在其 ...

  7. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  8. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  9. Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现

    周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...

随机推荐

  1. Siverlight+WCF+Nhibernate 开发之旅(一)

    最近正在开发sl程序,考虑了很久,参考了一些框架,令人头疼的数据访问层最终选择wcf+nhibernate,至于为什么选择wcf和nh,个人参考了其他的框架感觉这两者结合从开发效率和便捷性方面比其他的 ...

  2. poj2190

    #include <stdio.h> #include <stdlib.h> int main() { ]; ,i; scanf("%s",arr); ;i ...

  3. kafka学习(三)-kafka集群搭建

    kafka集群搭建 下面简单的介绍一下kafka的集群搭建,单个kafka的安装更简单,下面以集群搭建为例子. 我们设置并部署有三个节点的 kafka 集合体,必须在每个节点上遵循下面的步骤来启动 k ...

  4. java中的上传下载----ajaxFileUpload+struts2

    文件上传在项目中应该是非常常见的,而且很多时候,上传文件都只是一个小页面中的一个功能,要求在实现文件上传的前提下不刷新页面.而一般情况下将客户端的文件包装成网络地址传递到服务器端然后通过流来进行文件传 ...

  5. Cocos2d—X游戏开发之CCTableView详解(十一)

    本来很早就想写关于CCTableView的文章,但是在基本功能实现之后呢,项目需求增加导致对这个控件的研究必须更加深入一点. 好的,现在开始介绍一下这个控件,在Cocos2d—X引擎中,这是一个仿制i ...

  6. 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

  7. SICP 练习 (2.9)解决摘要:宽度和区间运算的关系间隔

    SICP 2.9 像是一个数学题,要我们证明区间的和与差的宽度是被加和被减的区间的宽度的函数,而对于乘法和除法来说不成立. 书中所谓宽度就是区间起点和终点差的一半.以我看来更像是区间宽度的一半.无论怎 ...

  8. NAND FLASH

    NAND Flash 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用. 1. 概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输.地址 ...

  9. 从零开始学习UNITY3D(GUI篇 群组视图控件)

    控件组可以看成一个大的容器,控件组里面的控件,相对位置已该控件组为基准,而不再已屏幕左上角为基准. 下面来看一下代码实例及其效果截图: public class GUI2 : MonoBehaviou ...

  10. Foundation 学习

    官网 Foundation是个跟bootstrap齐名的前端框架. 移动优先,响应式,最低支持IE8. html+css+jq构建 网格Grid Basic: .row父容器 子元素类.column  ...