传感器的简单应用之光照传感器

1.手机上传感器的使用首先需要得到系统服务

private SensorManager mSensorManager;
mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);

2.然后得到在得到服务的类型,即选用哪种传感器

 Sensor sensor=mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

3.需要注册监听传感器的使用

//注册监听事件,第一个参数是SensorEventListener,第二个参数是传感器的类型,第三个参数是刷新频率,mSensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);

4.注册监听事件是:

//当传感器精度发生变化时,会调用onAccuracyChanged方法,当传感器检测到的数值发生变化时,就会调用onSensorChanged方法//在光照强度监听住event数组中目前只有一个值,即光照强度private SensorEventListener listener=new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {float values=event.values[0];mTextView.setText("当前关照强度为"+values+"lx");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};

5.最后在onDestory中注销该监听事件,释放资源

 if (mSensorManager!=null){mSensorManager.unregisterListener(listener);//注销监听事件,释放资源}

传感器的简单应用之加速度传感器

1.加速度传感器的使用基本和光照传感器类似,只不过是将得到的传感器的类型改变为TYPE_ACCELEROMETER

 private SensorManager mSensorManager;
mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);Sensor sensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mSensorManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);

2.在注册监听事件中SensorEvent的values数组存放了3个值

//加速度传感器的监听事件,在values数组中会存放3个值,分别代表手机在X轴Y轴Z轴方向上的加速度信息//由于地心引力的存在,初始的加速度的值大约为9.8m/s*s,当手机平放的时候这个加速度是在Z轴方向上的//当手机竖起来的时候这个加速度是在Y轴上的,当手机横立起来的时候这个加速度方向是在X轴上的private SensorEventListener listener=new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {float xValues=event.values[0];float yValues=event.values[1];float zValues=event.values[2];//模仿微信摇一摇功能if(xValues>15.0||yValues>15.0||zValues>15.0){//如果某一个方向上的加速度值大于15.0就弹出一个ToastToast.makeText(AccelerometerActivity.this, "恭喜获奖", Toast.LENGTH_SHORT).show();}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};

3.最后在onDestroy()方法中注销监听事件,释放资源

 @Overrideprotected void onDestroy() {super.onDestroy();if (mSensorManager!=null){mSensorManager.unregisterListener(listener);}}

传感器的综合引用,加速度传感器和地磁传感器的结合,以及SurfaceView绘画来制作一个简单的指南针

1.首先是得到这两个传感器,然后进行注册监听。

  private SensorManager mSensorManager;mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);//得到传感器服务Sensor sensorAcc=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到加速度传感器Sensor sensorMagn=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);//得到地磁传感器mSensorManager.registerListener(listener,sensorAcc,SensorManager.SENSOR_DELAY_GAME);//注册加速度传感器监听事件mSensorManager.registerListener(listener,sensorMagn,SensorManager.SENSOR_DELAY_GAME);//注册地磁传感器监听事件

2.然后在监听事件中得到加速度传感器和地磁传感器的值,并将值进行计算得到旋转的弧度,然后转换成旋转的角度,最后将得到的角度传递给SurfaceView上

 private SensorEventListener listener=new SensorEventListener() {float[] accValues=new float[3];float[] magnValues=new float[3];@Overridepublic void onSensorChanged(SensorEvent event) {//加速度传感器上有3个值分别代表X轴Y轴和Z轴上的值,因此需要将其赋值到一个float数组中if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){accValues=event.values.clone();}//地磁传感器上的event上也有3个值,分别代表X轴Y轴Z轴方向上的磁力分量else if (event.sensor.getType()== Sensor.TYPE_MAGNETIC_FIELD){magnValues=event.values.clone();}float[] R=new float[9];float[] values=new float[3];//调用getRotationMatrix()方法会得到一个包含旋转矩阵的R数组//第一个参数是一个长度为9的float数组,getRotationMatrix()方法计算出来的旋转数据就会赋值到这个数组中去,//第二个参数是一个用于将地磁向量转换成重力坐标的旋转矩阵,通常指定为null即可//第三个和第四个参数分别传入加速度传感器和地磁传感器的输出值SensorManager.getRotationMatrix(R,null,accValues,magnValues);//getOrientation()该方法就可以计算手机的旋转数据了//R是getRotationMatrix方法得到的旋转矩阵,values是一个长度为3的float数组,手机在各个方向上的旋转数据都会被存放到这个数组中//values[0]表示手机围Z轴的旋转角度,values[1]表示手机围绕X轴的旋转角度,values[2]表示手机围绕Y轴的旋转角度SensorManager.getOrientation(R,values);//将得到的数据转换(弧度)成角度//将得到的角度传入到Message中然后通过Handler发送到SurfaceView上去float roateDegree=- (float) Math.toDegrees(values[0]);Message msg=new Message();msg.obj=roateDegree;msg.what=Config.DEGREE;handler.sendMessage(msg);
//            Log.d("degree","value[0]的值为"+Math.toDegrees(values[0]));
//            Log.d("degree","value[1]的值为"+Math.toDegrees(values[1]));
//            Log.d("degree","value[2]的值为"+Math.toDegrees(values[2]));}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};

3.在SurfaceView中绘制指南针
因为SurfaceView不像View一样UI主线程会调用View的OnDraw方法,而SurfaceView中和 主线程没有任何关系,因此在SurfaceView中进行要实现CallBack方法,然后实现在surfaceCreated方法中创建一个线程,然后利用Handler进行通讯
(1)首先得到SurfaceHolder,得到这个View的持有者
(2)然后继承SurfaceHolder.Callback接口,复写里面的方法surfaceCreated、surfaceChanged、surfaceDestroyed这三个方法,

 private SurfaceHolder surfaceHolder;surfaceHolder=getHolder();surfaceHolder.addCallback(this);

(3)在surfaceCreated方法中创建一个线程进行绘制操作

 @Overridepublic void surfaceCreated(final SurfaceHolder holder) {thread=new Thread(new Runnable() {@Overridepublic void run() {while (isRun){mCanvas=holder.lockCanvas();//首先是锁定画布mCanvas.drawColor(Color.WHITE);//添加一个背景为白色的画布mCanvas.drawCircle(width/2,height/2,200,mPaintCircle);mCanvas.drawPoint(width/2,height/2,mPaintPoint);mPathRed.reset();mPathRed.moveTo(width/2-20,height/2);mPathRed.lineTo(width/2+20,height/2);mPathRed.lineTo(width/2,height/2-40);mPathRed.close();mCanvas.drawPath(mPathRed,mPaintRed);mPathBlue.reset();mPathBlue.moveTo(width/2-20,height/2);mPathBlue.lineTo(width/2+20,height/2);mPathBlue.lineTo(width/2,height/2+40);mPathBlue.close();mCanvas.drawPath(mPathBlue,mPaintBule);for (int i=1;i<=12;i++){mCanvas.save();mCanvas.rotate(degree+360/12*i,width/2,height/2);//将从主线程传递过来的角度添加上去重新绘制mCanvas.drawLine(width/2,height/2-200,width/2,height/2-180,mPaintCircle);mCanvas.restore();}for (int i=1;i<=4;i++){mCanvas.save();mCanvas.rotate(degree+360/4*i,width/2,height/2);//将从主线程传递过来的角度添加上去重新绘制mCanvas.drawText(array[i-1],width/2,height/2-120,mPaintText);mCanvas.restore();}holder.unlockCanvasAndPost(mCanvas);//最后将所画的内容提交上去,与lockCanvas配合使用try {//因为Android手机的刷新频率一般为每秒25帧到30帧,因此延时一个来减少刷新频率以及减少无用功Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}});thread.start();}

指南针的程序为:

MainActivity

public class MagneticAcitvity extends AppCompatActivity {private Compass mCompassView;private SensorManager mSensorManager;private Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case Config.DEGREE:float degree= (float) msg.obj;mCompassView.setDegree(degree);break;}}};private SensorEventListener listener=new SensorEventListener() {float[] accValues=new float[3];float[] magnValues=new float[3];@Overridepublic void onSensorChanged(SensorEvent event) {//加速度传感器上有3个值分别代表X轴Y轴和Z轴上的值,因此需要将其赋值到一个float数组中if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){accValues=event.values.clone();}//地磁传感器上的event上也有3个值,分别代表X轴Y轴Z轴方向上的磁力分量else if (event.sensor.getType()== Sensor.TYPE_MAGNETIC_FIELD){magnValues=event.values.clone();}float[] R=new float[9];float[] values=new float[3];//调用getRotationMatrix()方法会得到一个包含旋转矩阵的R数组//第一个参数是一个长度为9的float数组,getRotationMatrix()方法计算出来的旋转数据就会赋值到这个数组中去,//第二个参数是一个用于将地磁向量转换成重力坐标的旋转矩阵,通常指定为null即可//第三个和第四个参数分别传入加速度传感器和地磁传感器的输出值SensorManager.getRotationMatrix(R,null,accValues,magnValues);//getOrientation()该方法就可以计算手机的旋转数据了//R是getRotationMatrix方法得到的旋转矩阵,values是一个长度为3的float数组,手机在各个方向上的旋转数据都会被存放到这个数组中//values[0]表示手机围Z轴的旋转角度,values[1]表示手机围绕X轴的旋转角度,values[2]表示手机围绕Y轴的旋转角度SensorManager.getOrientation(R,values);//将得到的数据转换(弧度)成角度//将得到的角度传入到Message中然后通过Handler发送到SurfaceView上去float roateDegree=- (float) Math.toDegrees(values[0]);Message msg=new Message();msg.obj=roateDegree;msg.what=Config.DEGREE;handler.sendMessage(msg);
//            Log.d("degree","value[0]的值为"+Math.toDegrees(values[0]));
//            Log.d("degree","value[1]的值为"+Math.toDegrees(values[1]));
//            Log.d("degree","value[2]的值为"+Math.toDegrees(values[2]));}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_magnetic);mSensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);//得到传感器服务Sensor sensorAcc=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);//得到加速度传感器Sensor sensorMagn=mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);//得到地磁传感器mSensorManager.registerListener(listener,sensorAcc,SensorManager.SENSOR_DELAY_GAME);//注册加速度传感器监听事件mSensorManager.registerListener(listener,sensorMagn,SensorManager.SENSOR_DELAY_GAME);//注册地磁传感器监听事件mCompassView= (Compass) findViewById(R.id.myview_compass);}@Overrideprotected void onDestroy() {super.onDestroy();if (mSensorManager!=null){mSensorManager.unregisterListener(listener);//注销listener}}
}

SurfaceView

public class Compass extends SurfaceView implements SurfaceHolder.Callback{private int width;private int height;private SurfaceHolder surfaceHolder;private Thread thread;private Paint mPaintCircle;private Paint mPaintPoint;private Paint mPaintRed;private Paint mPaintBule;private Paint mPaintText;private Canvas mCanvas;private boolean isRun=true;private Path mPathRed;private Path mPathBlue;private String[] array={"E","S","W","N"};private float degree=0;/**** 该方法用来得到从传感器得到的旋转角度* @param degree  旋转角度*/public void setDegree(float degree) {this.degree = degree;}public Compass(Context context) {super(context);}public Compass(Context context, AttributeSet attrs) {super(context, attrs);mPathRed=new Path();mPathBlue=new Path();mPaintText=new Paint();mPaintText.setColor(Color.BLACK);mPaintText.setTextAlign(Paint.Align.CENTER);mPaintText.setTextSize(50);mPaintRed=new Paint();mPaintRed.setColor(Color.RED);mPaintRed.setStyle(Paint.Style.FILL);mPaintRed.setStrokeWidth(10);mPaintBule=new Paint();mPaintBule.setColor(Color.BLUE);mPaintBule.setStyle(Paint.Style.FILL);mPaintBule.setStrokeWidth(10);surfaceHolder=getHolder();surfaceHolder.addCallback(this);mPaintPoint=new Paint();mPaintPoint.setColor(Color.BLACK);mPaintPoint.setStrokeWidth(10);mPaintCircle=new Paint();mPaintCircle.setColor(Color.BLACK);mPaintCircle.setAntiAlias(true);mPaintCircle.setStrokeWidth(5);mPaintCircle.setStyle(Paint.Style.STROKE);}//设置画布的长和高@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);height=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);setMeasuredDimension(width,height);}@Overridepublic void surfaceCreated(final SurfaceHolder holder) {thread=new Thread(new Runnable() {@Overridepublic void run() {while (isRun){mCanvas=holder.lockCanvas();//首先是锁定画布mCanvas.drawColor(Color.WHITE);//添加一个背景为白色的画布mCanvas.drawCircle(width/2,height/2,200,mPaintCircle);mCanvas.drawPoint(width/2,height/2,mPaintPoint);mPathRed.reset();mPathRed.moveTo(width/2-20,height/2);mPathRed.lineTo(width/2+20,height/2);mPathRed.lineTo(width/2,height/2-40);mPathRed.close();mCanvas.drawPath(mPathRed,mPaintRed);mPathBlue.reset();mPathBlue.moveTo(width/2-20,height/2);mPathBlue.lineTo(width/2+20,height/2);mPathBlue.lineTo(width/2,height/2+40);mPathBlue.close();mCanvas.drawPath(mPathBlue,mPaintBule);for (int i=1;i<=12;i++){mCanvas.save();mCanvas.rotate(degree+360/12*i,width/2,height/2);//将从主线程传递过来的角度添加上去重新绘制mCanvas.drawLine(width/2,height/2-200,width/2,height/2-180,mPaintCircle);mCanvas.restore();}for (int i=1;i<=4;i++){mCanvas.save();mCanvas.rotate(degree+360/4*i,width/2,height/2);//将从主线程传递过来的角度添加上去重新绘制mCanvas.drawText(array[i-1],width/2,height/2-120,mPaintText);mCanvas.restore();}holder.unlockCanvasAndPost(mCanvas);//最后将所画的内容提交上去,与lockCanvas配合使用try {//因为Android手机的刷新频率一般为每秒25帧到30帧,因此延时一个来减少刷新频率以及减少无用功Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}});thread.start();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if (isRun==true){//档SurfaceView被销毁时,线程也被停止isRun=false;}}
}

传感器的应用/SurfaceView/制作简单的指南针相关推荐

  1. Arduino 用声音传感器制作简单的“声纹锁”

    Arduino 用声音传感器制作简单的"声纹锁" 前言 之前就一直在想如何用Arduino制作一个门锁,简单廉价,又可以很方便的开门,最后想了一个办法,就是使用一个声音传感器,制作 ...

  2. html根据字段制作曲线图,canvas制作简单的HTML图表,折线或者矩形统计(原创)

    插件描述:canvas制作简单的HTML图表,折线或者矩形统计 使用canvas制作简单的HTML图表,折线或者矩形统计. 使用canvas制作简单的HTML图表,折线或者矩形统计,简单而实用.图形由 ...

  3. 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰

    [教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...

  4. phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

    制作简单的acl, dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等) ...

  5. python爬虫图片-如何用Python来制作简单的爬虫,爬取到你想要的图片

    原标题:如何用Python来制作简单的爬虫,爬取到你想要的图片 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我 ...

  6. hbuilderx制作简单网页_网页制作的基本步骤是怎样的?制作简单网页的具体操作有哪些呢?...

    网页制作的基本步骤是怎样的?制作简单网页的具体操作有哪些呢?如果是详细的网页制作,设计和制作一样关键.有可能是网页设计制作新手对简单网页制作设计的具体操作不太清楚.更别说设计详细的网页了.下面一起来看 ...

  7. php简单网页制作代码,用HTML和CSS以及JS制作简单的网页菜单界面的代码

    这篇文章主要介绍了使用HTML+CSS+JS制作简单的网页菜单界面,这个ABROAD项目所使用的JavaScript部分代码非常简单,需要的朋友可以参考下 写ABROAD项目用到了标签这个东东,其实标 ...

  8. python中excel制作成绩报表_python制作简单excel统计报表2之操作excel的模块openpyxl简单用法...

    python制作简单excel统计报表2之操作excel的模块openpyxl简单用法 # coding=utf-8 from openpyxl import Workbook, load_workb ...

  9. java验证码功能一般怎么做的_java制作简单验证码功能

    本文实例为大家分享了java制作简单验证码的具体代码,供大家参考,具体内容如下 在这里我们需要用到java的画笔工具,所以我们需要导入以下包 import="java.util.*,java ...

最新文章

  1. [SCOI2007]修车
  2. 刻意练习:Python基础 -- Task06. 字典与集合
  3. 修改进程权限(转载)
  4. MAC安装mysql8.0.11以及修改root密码
  5. MySQL处理中文乱码问题
  6. 一篇文章带你详解 TCP/IP 协议(上)
  7. 脚本——倒计时,ping,创建用户,作业:ssh并创建用户(未能实现功能)
  8. 随笔:web服务器中建立一个小的个人站点
  9. 西门子新款A系列手机【ZZ】
  10. Asp.net如何截屏
  11. hdu 2489 Minimal Ratio Tree (DFS枚举+MST)
  12. Citus高可用方案演进介绍
  13. JAVA DES加密解密代码范例
  14. Redis管理及监控工具treeNMS
  15. 漂亮的英文字体 android,资深字体设计师私藏的10大APP,只怪你知道的太晚 !
  16. 一键抓取网页的所有图片
  17. Simpson积分应用
  18. 无法和 SFTP 服务器建立 FTP 连接,请选择合适的协议。
  19. 显卡---显卡驱动---CUDA---Cudnn
  20. python自动生成ppt报告_把时间还给洞察,且看PPT调研报告自动生成攻略

热门文章

  1. 第一篇博客----试水
  2. 1. 编写函数 cal_numbers:参数为字符串,统计并返回该字符串中的英文字母、空格、数字和其它字符的个数
  3. 全球及中国多晶硅产业竞争态势及发展前景研究报告2021-2027年
  4. python飞机大战实验报告心得_Python学习之路「第七篇」-Pygame之飞机大战1
  5. 【云周刊】第171期:重磅推荐,神龙架构首次开箱直播评测
  6. 在线客服系统源码(外贸多语言带翻译网页在线客服系统源码完整搭建)
  7. web前端期末大作业:JavaScript大作业——福五鼠动漫网页制作(6页)带轮播图效果 学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作
  8. Spring面试题(2022最新版)
  9. Linux下FTP;LFTP;TFTP;SFTP;NCFTP;RCP;SCP的使用
  10. 计算机对水利方面的影响,计算机技术对于水利工程信息化系统的优化作用