Android传感器使用实例介绍
上后左爱 人气:0传感器
1.mainActivity 实现SensorEventListerner 方法
2. 定义:SensorManage 对象
3. 在重写的onResum 方法中 为重力和光线传感器注册监听器 sensorManage.registerListener()
4. 在实现的onSensorChanged 方法中 获取传感器的类型
5. 借助硬件 从软件接口上使用光线传感器,根据外界屏幕亮度 修改屏幕亮度
package com.mingrisoft; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; public class MainActivity extends AppCompatActivity implements SensorEventListener { EditText textGRAVITY, textLIGHT; //传感器输出信息的编辑框 private SensorManager sensorManager; //定义传感器管理 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textGRAVITY = (EditText) findViewById(R.id.textGRAVITY); //获取重力传感器输出信息的编辑框 textLIGHT = (EditText) findViewById(R.id.textLIGHT); //获取光线传感器输出信息的编辑框 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); //获取传感器管理 } @Override protected void onResume() { super.onResume(); //为重力传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY), SensorManager.SENSOR_DELAY_GAME); //为光线传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT), SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { //取消注册监听器 sensorManager.unregisterListener(this); super.onPause(); } @Override protected void onStop() { //取消注册监听器 sensorManager.unregisterListener(this); super.onStop(); } @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; //获取X、Y、Z三轴的输出信息 int sensorType = event.sensor.getType(); //获取传感器类型 StringBuilder stringBuilder = null; switch (sensorType) { case Sensor.TYPE_GRAVITY: stringBuilder = new StringBuilder(); stringBuilder.append("X轴横向重力值:"); stringBuilder.append(values[0]); stringBuilder.append("\nY轴纵向重力值:"); stringBuilder.append(values[1]); stringBuilder.append("\nZ轴向上重力值:"); stringBuilder.append(values[2]); textGRAVITY.setText(stringBuilder.toString()); break; case Sensor.TYPE_LIGHT: stringBuilder = new StringBuilder(); stringBuilder.append("光的强度值:"); stringBuilder.append(values[0]); textLIGHT.setText(stringBuilder.toString()); break; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }
磁场传感器
- 自定义的View 实现SensorEventListener 接口
- 获取注册磁场传感器,获取传感器值
- 根据X,Y轴绘制指针
package com.example.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.AttributeSet; import android.view.View; public class PointerView extends View implements SensorEventListener { //定义指针位图 private Bitmap pointer = null; //定义传感器三轴的输出信息 private float[] allValue; //定义传感器管理 private SensorManager sensorManager; public PointerView(Context context, AttributeSet attrs) { super(context); // 获取需要绘制的指针图 pointer = BitmapFactory.decodeResource(super.getResources(), R.drawable.pointer ); // 获取传感器 sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); //为磁场传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME); } @Override public void onSensorChanged(SensorEvent sensorEvent) { if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD ){ float value[] = sensorEvent.values; //获取磁场传感器三轴的输出信息 allValue = value; // 保存输出信息 super.postInvalidate(); // 刷新界面 } } @Override public void onAccuracyChanged(Sensor sensor, int i) { } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint p = new Paint(); if (allValue != null) { float x = allValue[0]; float y = allValue[1]; // 重置图像 canvas.translate(super.getWidth() / 2, super.getHeight() / 2); try{ canvas.restore(); }catch (Exception e) { } if (y == 0 && x > 0) { canvas.rotate(90); // 旋转角度为90度 } else if (y == 0 && x < 0) { canvas.rotate(270); // 旋转角度为270度 } else { //通过三角函数tanh()方法计算旋转角度 if (y >= 0) { canvas.rotate((float) Math.tanh(x / y) * 90); } else { canvas.rotate(180 + (float) Math.tanh(x / y) * 90); } } } // 绘制指针 canvas.drawBitmap(this.pointer, -this.pointer.getWidth() / 2, -this.pointer.getHeight() / 2, p); } }
加速度传感器
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDialog; import android.app.Service; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; //定义传感器管理器 private Vibrator vibrator; //定义振动器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 获取传感器管理器 vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); //获取振动器服务 } @Override protected void onResume() { super.onResume(); //为加速度传感器注册监听器 sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); } @Override public void onSensorChanged(SensorEvent sensorEvent) { if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { float[] values = sensorEvent.values; //获取传感器X、Y、Z三个轴的输出信息 if (values[0] > 15 || values[1] > 15 || values[2] > 20) { // 加速度传感器上速度大于某个阈值 启动摇一摇 Toast.makeText(MainActivity.this, "摇一摇", Toast.LENGTH_SHORT).show(); //创建AlertDialog.Builder对象 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setView(R.layout.packet); //添加布局文件 alertDialog.show(); //显示alertDialog vibrator.vibrate(500); sensorManager.unregisterListener(this); //取消注册监听器 } } } @Override public void onAccuracyChanged(Sensor sensor, int i) { } }
方向传感器
- 手机的摆放状态
- 手机在水平方向翘起角度,手机在Y轴翘起角度
- 加速度传感器 + 磁场传感器实现方向创亲戚
- getRoationMatrix() 获取到其R数组
- SensorManager.getOrientation 获取弧度
package com.example.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.AttributeSet; import android.view.View; import androidx.annotation.Nullable; public class SpiritLevelView extends View implements SensorEventListener { private Bitmap bubble; // 定义水平仪中的小蓝球位图 private int MAX_ANGLE = 30; // 定义水平仪最大倾斜角,超过该角度,小蓝球将直接位于边界 private int bubbleX, bubbleY; // 定义水平仪中小蓝球的X、Y坐标 public SpiritLevelView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); bubble = BitmapFactory // 加载小蓝球图片 .decodeResource(getResources(), R.drawable.bubble); SensorManager sensorManager = (SensorManager) context .getSystemService(Context.SENSOR_SERVICE); // 获取传感器管理 sensorManager.registerListener(this, //为磁场传感器注册监听器 sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_GAME); sensorManager.registerListener(this, //为加速度传感器注册监听器 sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); } // 定义加速度传感器 float[] accelerometerValues = new float[3]; // 定义磁感器加速器 float[] magneticValues = new float[3]; @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { //如果当前为加速度传感器 accelerometerValues = event.values.clone(); //将取出的值放到加速度传感器取值数组中 } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { //如果当前为磁场传感器 magneticValues = event.values.clone(); //将取出的值放到磁场传感器取值数组中 } float[] R = new float[9]; //创建存放旋转数据的取值数组 float[] values = new float[3]; //创建存放方向数据的取值数组 SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues); SensorManager.getOrientation(R, values); //获取方向Z轴、X轴、Y轴信息值 float xAngle = (float) Math.toDegrees(values[1]); // 获取与X轴的夹角 float yAngle = (float) Math.toDegrees(values[2]); // 获取与Y轴的夹角 getPosition(xAngle,yAngle); //获取小蓝球的位置坐标 super.postInvalidate(); // 刷新界面 } @Override public void onAccuracyChanged(Sensor sensor, int i) { } //根据x轴和y轴的旋转角度确定小蓝球的位置 private void getPosition(float xAngle,float yAngle){ // 小蓝球位于中间时(水平仪完全水平),小蓝球的X、Y坐标 int x = (super.getWidth() - bubble.getWidth()) / 2; int y = (super.getHeight() - bubble.getHeight()) / 2; /********控制小球的X轴位置******/ if (Math.abs(yAngle) <= MAX_ANGLE) { // 如果Y轴的倾斜角度还在最大角度之内 // 根据Y轴的倾斜角度计算X坐标的变化值(倾斜角度越大,X坐标变化越大) int deltaX = (int) ((super.getWidth() - bubble.getWidth()) / 2 * yAngle / MAX_ANGLE); x -= deltaX; } else if (yAngle > MAX_ANGLE) { // 如果Y轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最左边 x = 0; } else { // 如果与Y轴的倾斜角已经小于负的MAX_ANGLE,小蓝球在最右边 x = super.getWidth() - bubble.getWidth(); } /********控制小球的Y轴位置******/ if (Math.abs(xAngle) <= MAX_ANGLE) { // 如果X轴的倾斜角度还在最大角度之内 // 根据X轴的倾斜角度计算Y坐标的变化值(倾斜角度越大,Y坐标变化越大) int deltaY = (int) ((super.getHeight() - bubble.getHeight()) / 2 * xAngle / MAX_ANGLE); y += deltaY; } else if (xAngle > MAX_ANGLE) { // 如果与X轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最下边 y = super.getHeight() - bubble.getHeight(); } else { // 如果X轴的倾斜角已经小于负的MAX_ANGLE,小蓝球在最上边 y = 0; } //更新小蓝球的坐标 bubbleX = x; bubbleY = y; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bubble, bubbleX, bubbleY, null); // 根据小蓝球坐标绘制小蓝球 } }
加载全部内容