最近开发需要集成高德地图,有自己的云图神马的。。但是遇到一个小问题。
设计跟我说:需要定位图标随着人走动或者旋转 而指向也旋转。。。。这。。。刚开始根本没想到。。。
于是乎,就去翻高德提供的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); }