Android应用开发提高篇(3)-----传感器(Sensor)编程
2012-02-29 14:39
543 查看
[b]一、概述[/b]
Android支持的传感器种类越来越多了,这确实是一件可喜的事情,两年前在单片机上玩过加速度传感器模块,当时做的是一个摔倒检测的项目,利用相关的算法对三轴数据进行采集、处理、判断来实现检测,既然是摔倒检测,那肯定是一个便携式设备吧,没错,当时做出来的设备是小到可以放进口袋里的。庆幸的是,今天这些东西完全可以在手机上完成了,而且不用涉及到硬件设计的问题,不过今天不是讲如何去移植那个项目,而是讲讲Android上的传感器编程。Android,再一次让我看到你的强大!再一次坚定了我学习你的信心!
[b]二、要求[/b]
了解、熟悉传感器的编程方法。
[b]三、实现[/b]
新建工程MySensor,修改/res/layout/main.xml文件,在里面添加一个SurfaceView,完整的main.xml文件如下:
接着,修改MySensorActivity.java文件,代码中有详细注释,完整的MySensorActivity.java文件如下:
好了,在真机上运行它,效果如下:
晃动手机几下,效果如下:
完成。
Android支持的传感器种类越来越多了,这确实是一件可喜的事情,两年前在单片机上玩过加速度传感器模块,当时做的是一个摔倒检测的项目,利用相关的算法对三轴数据进行采集、处理、判断来实现检测,既然是摔倒检测,那肯定是一个便携式设备吧,没错,当时做出来的设备是小到可以放进口袋里的。庆幸的是,今天这些东西完全可以在手机上完成了,而且不用涉及到硬件设计的问题,不过今天不是讲如何去移植那个项目,而是讲讲Android上的传感器编程。Android,再一次让我看到你的强大!再一次坚定了我学习你的信心!
[b]二、要求[/b]
了解、熟悉传感器的编程方法。
[b]三、实现[/b]
新建工程MySensor,修改/res/layout/main.xml文件,在里面添加一个SurfaceView,完整的main.xml文件如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="180dip" /> </LinearLayout>
接着,修改MySensorActivity.java文件,代码中有详细注释,完整的MySensorActivity.java文件如下:
package com.nan.sensor; import android.app.Activity; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; public class MySensorActivity extends Activity { private float acceValusX = 0f; private float acceValusY = 0f; private float acceValusZ = 0f; private int x = 0; private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private Paint mPaint = null; private SensorManager mSensorManager; private Sensor mAccelerometer; private OnSensorEventListener mOnSensorEventListener = new OnSensorEventListener(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(new MyHolder()); mPaint = new Paint(); //画笔的粗细 mPaint.setStrokeWidth(1.0f); //从系统服务中获得传感器管服务 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //注册传感器监听 mSensorManager.registerListener(mOnSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_GAME); } private class OnSensorEventListener implements SensorEventListener { @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub //获得x轴的值 acceValusX = event.values[0]; //获得y轴的值 acceValusY = event.values[1]; //获得z轴的值 acceValusZ = event.values[2]; //锁定整个SurfaceView Canvas mCanvas = mSurfaceHolder.lockCanvas(); try { if(mCanvas!=null) { //画笔的颜色(红) mPaint.setColor(Color.RED); //画X轴的点 mCanvas.drawPoint(x, (int)(30 + acceValusX), mPaint); //画笔的颜色(绿) mPaint.setColor(Color.GREEN); //画Y轴的点 mCanvas.drawPoint(x, (int)(60 + acceValusY), mPaint); //画笔的颜色(蓝) mPaint.setColor(Color.BLUE); //画Z轴的点 mCanvas.drawPoint(x, (int)(90 + acceValusZ), mPaint); //横坐标+1 x++; //如果已经画到了屏幕的最右边 if(x > getWindowManager().getDefaultDisplay().getWidth()) { x = 0; //清屏 mCanvas.drawColor(Color.BLACK); } //绘制完成,提交修改 mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } catch(Exception e) { e.printStackTrace(); } finally { if(mCanvas!=null) { //重新锁一次 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } } //定义一个类,实现Callback接口 public class MyHolder implements SurfaceHolder.Callback { public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub //add your code } public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub //add your code } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub //add your code } } @Override public void onDestroy() { super.onDestroy(); //注销传感器监听 mSensorManager.unregisterListener(mOnSensorEventListener, mAccelerometer); } }
好了,在真机上运行它,效果如下:
晃动手机几下,效果如下:
完成。
相关文章推荐
- Android应用开发提高篇(3)-----传感器(Sensor)编程(转)
- Android应用开发提高篇(3)-----传感器(Sensor)编程
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)(转载)
- [Android实例] Sensor传感器源码的阅读与应用开发简单实例
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
- Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类
- 使用IntelliJ IDEA(androidstudio前身)开发android移动应用前的基本设置,提高开发效率
- Android Orientation Sensor(方向传感器)详解与应用
- Android开发-Sensor传感器-AndroidStudio(二)小方
- Android Orientation Sensor(方向传感器)详解与应用
- android应用开发之性能提高
- android开发之提高应用启动速度_splash页面瞬间响应_避免APP启动闪白屏
- 10个经典的Android开源应用项目,提高你的开发能力
- Android开发之提高应用启动速度splash页面瞬间响应 避免APP启动闪白屏
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)