传感器练习---方向水平仪

前提是你 提交于 2020-01-16 18:34:39

传感器练习—方向水平仪

运行结果:随着手机的摆动球也会随之运动
在这里插入图片描述

步骤:

在这里插入图片描述

  1. 第一步创建自定义的View并实现SensorEventListener
  2. 布局界面

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) {    //传感器的精度改变时触发

    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!