仿小米指南针,实现电子罗盘 您所在的位置:网站首页 安卓仿苹果qq 仿小米指南针,实现电子罗盘

仿小米指南针,实现电子罗盘

2024-01-04 18:06| 来源: 网络整理| 查看: 265

1、电子罗盘

项目需要,需要实现一个电子罗盘。现如今,手机传感器越来越灵敏,借助于手机实现电子罗盘,大大方便了野外工作人员。利用手机,可以实现岩层走向和倾向的测量,且精度也能得到一定的保证。利用方向传感器(之前使用的接口),现在换成磁场和加速度传感器联合求解三个方向,然后得到结构。

//获取传感器 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mag_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); acc_sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //给传感器注册监听: sensorManager.registerListener(this, acc_sensor, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(this, mag_sensor, SensorManager.SENSOR_DELAY_NORMAL); @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { accValues = event.values; } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magValues = event.values; }else if (event.sensor.getType() == Sensor.TYPE_PRESSURE) { preValues = event.values; } SensorManager.getRotationMatrix(r, null, accValues, magValues); SensorManager.getOrientation(r, values); //此处的values与方向传感器结果一致, //values[0] 手机的方位,正北为0°,顺时针180°为正,逆时针180°为负 //values[1] 手机上下倾斜程度 //values[2] 手机左右倾斜程度 } 2、UI设计

一个好的UI展示,往往能受到大家的喜欢。要想完全自定义一个UI,完全超出了我一个小草鸟的能力,而且时间不够,于是百度搜索,发现大佬们早已经写好,自己只需要改动部分代码,然后传入自己的值就行。在这里,对***ChaosAlaska***表示感谢感谢感谢,另外贴出大佬的链接地址:https://www.jianshu.com/p/cee9b7c3abe8?utm_source=oschina-app

想要了解的可以自己去看看,写的很详细,再次感谢。 在这里插入图片描述 1、感觉还是挺好的,点击“测量”,界面就会记录那一刻的实时的产状,方便我们进行记录或者进行其他得到操作;与此同时,“测量”变为“解锁”;同理,点击“解锁”,UI又实时更新产状,“解锁”变为”测量“。同时,底部也给出了产状的实时变化值。由于挺敏感的,要是有摆动,电子罗的指数变化还是挺快的,这里不知道是否需要设置阈值,到底影不影响使用。

2、界面的代码和上文贴出的大佬的基本一致,就是刻度以及参数的传入自己进行了设置,这里就不贴出重复的了,只贴出不同的部分,希望给到有需要的人。

2.1 计算产状 //传入 方向参数,数组的形式,上面获取到的 public void setValues(float [] values){ if(!isSave){ this.values = values; val = Math.round(values[0]*180.0/Math.PI); valStrike = Math.round(calculatedip(values)); invalidate(); } } //根据方向参数进行计算产状 private float calculatedip(float[] values) { float caculated_dia, caculated_dip; float dip; double values0; caculated_dip = (float) Math.acos(1 /Math.sqrt(Math.tan(values[1]) *Math.tan(values[1]) +Math.tan(values[2]) *Math.tan(values[2]) +1)); if(values[0] > 0) values0 = (double) values[0]; else values0 = 2 *Math.PI +values[0]; if(values[2] mCanvas.save(); int mTriangleHeight=(mOutSideRadius-mCircumRadius)/2; mCanvas.rotate(valStrike+90-val,mCenterX,mOutSideRadius+mTextHeight); mstrikeTriangle.moveTo(width/2,mOutSideRadius+mTextHeight-mCircumRadius+20); //内接三角形的边长,简单数学运算 float mTriangleSide = (float) ((mTriangleHeight/(Math.sqrt(3)))*2); mstrikeTriangle.lineTo(width/2-20,mOutSideRadius+mTextHeight); mstrikeTriangle.lineTo(width/2,mOutSideRadius+mTextHeight+mCircumRadius-20); mstrikeTriangle.lineTo(width/2+20,mOutSideRadius+mTextHeight); mstrikeTriangle.close(); mCanvas.drawPath(mstrikeTriangle,mstrikePaint); mCanvas.restore(); } //倾向线 private void drawDipLine() { mCanvas.save(); mCanvas.rotate(valStrike-val,mCenterX,mOutSideRadius+mTextHeight); mdipTriangle.moveTo(width/2,mOutSideRadius+mTextHeight-mCircumRadius+20); mdipTriangle.lineTo(width/2-20,mOutSideRadius+mTextHeight); mdipTriangle.lineTo(width/2+20,mOutSideRadius+mTextHeight); mdipTriangle.close(); mCanvas.drawPath(mdipTriangle,mdiPaint); mCanvas.restore(); } //产状示数 private void drawOccuroceText() { String occurouce = "产状:"+ valStrike+"°"+ "∠"+ dip+"°"; mOccurrencePaint.getTextBounds(occurouce,0,occurouce.length(),mOccuTextRect); int owidth = mOccuTextRect.width(); int height = mOccuTextRect.height(); mCanvas.drawText(occurouce,width/2-owidth,mTextHeight+mOutSideRadius*2+height*3,mOccurrencePaint); } 3、使用

像控件一样使用,初始化即可。

//在布局里面设置 //调用方法,传入参数即可 miui.setValues(values);


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有