传感器练习—方向水平仪
运行结果:随着手机的摆动球也会随之运动
步骤:
- 第一步创建自定义的View并实现SensorEventListener
- 布局界面
3.为磁场传感器和加速度传感器注册监听器,并获取传感器的取值
4.获取z,x,y轴的旋转角度,并绘制小球并获取传感器的取值
package com.example.acer.suipingyi;
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 Spiritlevel extends View implements SensorEventListener {
private Bitmap bubble; //小球位图对象
float[] accelerometerValues=new float[3]; //加速度传感器的值
float[] magneticValues=new float[3]; //磁感传感器的值
private int max_angle=30; //设置最大倾斜角度
private int bubbleX,bubbleY; //小球的位置坐标
public Spiritlevel(Context context, AttributeSet attributeSet) {
super(context,attributeSet);
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); //为加速度传感器注册监听器
bubble= BitmapFactory.decodeResource(getResources(),R.drawable.buddle); //加载小球图片
}
@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); //获取方向值
float xAngle=(float)Math.toDegrees(values[1]); //x轴的旋转角度
float yAngle=(float)Math.toDegrees(values[2]); //x轴的旋转角度
getPosition(xAngle,yAngle); //获取小球的位置坐标
super.postInvalidate(); //刷新界面
}
//根据x轴y轴的旋转角度确定小球的位置
private void getPosition(float xAngle,float yAngle){
//小球位于中间时,水平仪完全水平,小球的XY坐标
int x=(super.getWidth()-bubble.getWidth())/2; //位于中心点
int y=(super.getWidth()-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();
}
//更新小球的坐标
bubbleX=x;
bubbleY=y;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bubble,bubbleX,bubbleY,new Paint()); //绘制小球
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { //传感器的精度改变时触发
}
}
来源:CSDN
作者:片言莫语
链接:https://blog.csdn.net/qq_43654669/article/details/104003277