目录
- 传感器
- 磁场传感器
- 加速度传感器
- 方向传感器
传感器
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.v.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[]);
stringBuilder.append("\nY轴纵向重力值:");
stringBuilder.append(values[]);
stringBuilder.append("\nZ轴向上重力值:");
stringBuilder.append(values[]);
textGRAVITY.setText(stringBuilder.toString());
break;
case Sensor.TYPE_LIGHT:
stringBuilder = new StringBuilder();
stringBuilder.append("光的强度值:");
stringBuilder.append(values[]);
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[];
float y = allValue[];
// 重置图像
canvas.translate(super.getWidth() /, super.getHeight() / 2);
try{
canvas.restore();
}catch (Exception e) {
}
if (y == && x > 0) {
canvas.rotate(); // 旋转角度为90度
} else if (y == && x < 0) {
canvas.rotate(); // 旋转角度为270度
} else {
//通过三角函数tanh()方法计算旋转角度
if (y >=) {
canvas.rotate((float) Math.tanh(x / y) *);
} else {
canvas.rotate( + (float) Math.tanh(x / y) * 90);
}
}
}
// 绘制指针
canvas.drawBitmap(this.pointer, -this.pointer.getWidth() /,
-this.pointer.getHeight() /, 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[] > 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();
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 =; // 定义水平仪最大倾斜角,超过该角度,小蓝球将直接位于边界
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[];
// 定义磁感器加速器
float[] magneticValues = new float[];
@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[]; //创建存放旋转数据的取值数组
float[] values = new float[]; //创建存放方向数据的取值数组
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
SensorManager.getOrientation(R, values); //获取方向Z轴、X轴、Y轴信息值
float xAngle = (float) Math.toDegrees(values[]); // 获取与X轴的夹角
float yAngle = (float) Math.toDegrees(values[]); // 获取与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()) /;
int y = (super.getHeight() - bubble.getHeight()) /;
/********控制小球的X轴位置******/
if (Math.abs(yAngle) <= MAX_ANGLE) { // 如果Y轴的倾斜角度还在最大角度之内
// 根据Y轴的倾斜角度计算X坐标的变化值(倾斜角度越大,X坐标变化越大)
int deltaX = (int) ((super.getWidth() - bubble.getWidth()) / * yAngle / MAX_ANGLE);
x -= deltaX;
} else if (yAngle > MAX_ANGLE) { // 如果Y轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最左边
x =;
} 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()) / * xAngle / MAX_ANGLE);
y += deltaY;
} else if (xAngle > MAX_ANGLE) { // 如果与X轴的倾斜角度已经大于MAX_ANGLE,小蓝球在最下边
y = super.getHeight() - bubble.getHeight();
} else { // 如果X轴的倾斜角已经小于负的MAX_ANGLE,小蓝球在最上边
y =;
}
//更新小蓝球的坐标
bubbleX = x;
bubbleY = y;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bubble, bubbleX, bubbleY, null); // 根据小蓝球坐标绘制小蓝球
}
}