Android简易指南针的实现(Kotlin)

作者: Yun丶Lei | 来源:发表于2017-08-23 23:44 被阅读46次
    android.jpg

    概述

    1、现在的Android手机都会有加速度传感器和磁场传感器,指南针实际上就是利用这两个传感器计算出现在所指向的方位。(当然实际上还能实现水平仪)
    2、然后一般会使用GPS定位得到现在的经纬度,就能实现一个指南针应有的所有功能。(本Demo为了显示实际地址使用了腾讯定位)

    预览

    1.jpg 2.jpg

    实现

    1、获取sensor实例

    fun initServices() {
            mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
            mOrientationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) //加速度传感器
            mMagneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)   //地磁场传感器
        }
    

    2、设置和取消监听

    override fun onResume() {
            super.onResume()
            mOrientationListener = MySensorEventListener()
            mMagneticListener = MySensorEventListener()
            mSensorManager.registerListener(mOrientationListener, mOrientationSensor, Sensor.TYPE_ACCELEROMETER)
            mSensorManager.registerListener(mMagneticListener, mMagneticSensor, Sensor.TYPE_MAGNETIC_FIELD)
            mStopDrawing = false
            mHandler.postDelayed(this, 20)
        }
    
        override fun onPause() {
            super.onPause()
            mStopDrawing = true
            mSensorManager.unregisterListener(mOrientationListener)
            mSensorManager.unregisterListener(mMagneticListener)
        }
    

    3、获取角度相关参数

    inner class MySensorEventListener : SensorEventListener2 {
            override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
    
            }
    
            override fun onFlushCompleted(sensor: Sensor?) {
    
            }
    
            override fun onSensorChanged(event: SensorEvent) {
                if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
                    accelerometerValues = event.values
                }
                if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
                    magneticFieldValues = event.values
                }
            }
    
        }
    

    4、计算方向和角度

    if (direction >= 22.5f && direction < 157.5f) {
        //east
    } else if (direction > -157.5f && direction < -22.5f) {
        //west
    }
    if (direction > 122.5f || direction < -122.5f) {
        // south
    } else if (direction < 67.5f && direction > -67.5f) {
        // north
    }
    

    5、罗盘绘制和旋转;网上有很多指南针demo罗盘都是使用的一张图片实现,本人觉得这样不是很美观,于是就简单绘制了一个。(表盘使用自定义View完成,通过绘制文字表盘刻度等实现无论如何旋转文字都是正的,大体思路如下;此View是使用最笨的 方式去实现的,还有很多需要完善的地方,具体代码实现可参考源码CompassDrawView

    canvas.save()           //保存画布,先旋转和方向无关的东西
    canvas.rotate(mDirection, (width / 2).toFloat(), (height / 2).toFloat())
    drawBackGroundCircle()
    drawScaleLine()
    canvas.restore()        //重置画布
    
    canvas.save()
    drawDirectionText()     //重置画布后通过传感器角度来确定文字的位置,以达到文字问正的情况
    drawAngleText()
    canvas.rotate(mDirection, (width / 2).toFloat(), (height / 2).toFloat())
    canvas.restore()
    drawNHand()             //最后画不需要动的指针
    

    Demo地址EasyCompass

    相关文章

      网友评论

        本文标题:Android简易指南针的实现(Kotlin)

        本文链接:https://www.haomeiwen.com/subject/amxsdxtx.html