运行结果:随着手机的摆动球也会随之运动
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私信 关注 总结 以上是内存溢出为你收集整理的传感器练习---方向水平仪全部内容,希望文章能够帮你解决传感器练习---方向水平仪所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)