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

传感器练习---方向水平仪,第1张

概述传感器练习—方向水平仪运行结果:随着手机的摆动球也会随之运动步骤:第一步创建自定义的View并实现SensorEventListener布局界面3.为磁场传感器和加速度传感器注册监听器,并获取传感器的取值4.获取z,x,y轴的旋转角度,并绘制小球并获取传感器的取值packagecom.exampl 传感器练习—方向水平仪

运行结果:随着手机的摆动球也会随之运动

步骤:

第一步创建自定义的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) {    //传感器的精度改变时触发    }}
点赞收藏分享文章举报

片言莫语发布了59 篇原创文章 · 获赞 5 · 访问量 4812私信 关注 总结

以上是内存溢出为你收集整理的传感器练习---方向水平仪全部内容,希望文章能够帮你解决传感器练习---方向水平仪所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存