您的位置:首页 > 移动开发 > Android开发

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文件如下:

<?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);
}

}


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



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



完成。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐