android高德地图自定义定位图标并具有类似陀螺仪旋转功能。

最近开发需要集成高德地图,有自己的云图神马的。。但是遇到一个小问题。

设计跟我说:需要定位图标随着人走动或者旋转 而指向也旋转。。。。这。。。刚开始根本没想到。。。

于是乎,就去翻高德提供的api文档。。。。坑啊。。真坑啊。。。

api文档是这样的:

哇塞。。看到这个方法。就很开森的去试试。。。。

就发现。。。我去。。这

居然是以控件的左上方来旋转的。。这。(◐﹏◐)。。继承android 特性。。。。哎,没办法。看来高德内部的接口方法使用不上了。只好另想办法。

幸好,心中有猛虎,细嗅蔷薇。。用下面的方法 setMyLocationStyle。设置绘制的样式。那只好不断的旋转要设置进去的控件,然后设置进去。这样就

可以达到不断旋转的效果。可是问题来了,这个旋转的值怎么获取到呢?

Yes,回答正确。当然是根据手机传感器呗。因为功能比较简单。所以就仅仅用方向传感器了。。。有别的需求或者爱好的童鞋可以试试别的传感器。。

具体怎么获取传感器的值,角度值的转化,和各个值代表什么意思。网上一搜一大堆。这里就不做累述。接下来,欣赏核心代码:

初始化传感器。注册监听。配置传感器。

   mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        aSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
//        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);陀螺仪
        mSensorManager.registerListener(myListener, aSensor,
                SensorManager.SENSOR_DELAY_GAME);
        mSensorManager.registerListener(myListener, mSensor,
                SensorManager.SENSOR_DELAY_GAME);

  final SensorEventListener myListener = new SensorEventListener() {

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerometerValues = event.values.clone();
            }
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                magneticFieldValues = event.values.clone();
            }
            if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
                floats = event.values[1];
            }

            //方向传感器
            // 调用getRotaionMatrix获得变换矩阵R[]
            SensorManager.getRotationMatrix(R2, null, accelerometerValues,
                    magneticFieldValues);
            SensorManager.getOrientation(R2, values);
            // 经过SensorManager.getOrientation(R, values);得到的values值为弧度
            // 转换为角度
            values[0] = (float) Math.toDegrees(values[0]);
//            values[2] = -values[2];
//            if (values[1] > 0) {
//                values[1] += 180;
//            }
            if (!isEntering) {
                setMyMarkerStyleUnEntitingXuanZhuan(values[0]);
            }

        }
    };
myListener 是自己的写的监听
代码是这样的:

float[] accelerometerValues = new float[3];
float[] magneticFieldValues = new float[3];
float[] values = new float[3];
float floats;
float[] R2 = new float[9];
View view1;
ImageView imageView;

  final SensorEventListener myListener = new SensorEventListener() {

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerometerValues = event.values.clone();
            }
            if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                magneticFieldValues = event.values.clone();
            }
            if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
                floats = event.values[1];
            }

            //方向传感器
            // 调用getRotaionMatrix获得变换矩阵R[]
            SensorManager.getRotationMatrix(R2, null, accelerometerValues,
                    magneticFieldValues);
            SensorManager.getOrientation(R2, values);
            // 经过SensorManager.getOrientation(R, values);得到的values值为弧度
            // 转换为角度
            values[0] = (float) Math.toDegrees(values[0]);
//            values[2] = -values[2];
//            if (values[1] > 0) {
//                values[1] += 180;
//            }
        //
                //设置旋转的代码
setMyMarkerStyleUnEntitingXuanZhuan( values[ 0]) ; } } ;

接下来请看设置旋转的代码

  public void setMyMarkerStyleUnEntitingXuanZhuan(float z) {
        view1 = View.inflate(this, R.layout.pokemon_custom_my_location_one, null);

        imageView = (ImageView) view1.findViewById(R.id.my_icon);
//        Log.e("view1的高度", "view1=" + imageView.getWidth());
//        view1.setRotation(z);
        imageView.setRotation(z);
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory
                .fromView(view1));
        myLocationStyle.anchor(0, 0);
        myLocationStyle.strokeColor(Color.argb(0, 0, 0, 0));
        myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0));
        aMap.setMyLocationStyle(myLocationStyle);
    }



ok。到此已经结束。。。好啦。。。小伙伴们。快去自定义自己想要的精美定位图标吧


你可能感兴趣的:(android高德地图自定义定位图标并具有类似陀螺仪旋转功能。)