关于百度地图的几个疑问:
1.从有MapView开始,就已经进入加载百度地图了,mMapView会选择某一点为中心点开始加载,默认是从天安门开始,一般防止跳转,都是将上次的位置保存起来,从上次的位置开始加载,如果有定位的话,接着再跳转到定位的位置。
地图跳转的原因:从有Mapview就开始加载,包括setcontentview入xml。之后有setMapStatus或MapStatusUpdate来更新地图,则地图再次改变,因而会出现跳转现象。
如果有时候,实现避免不了跳转,可以试着,加入View.setVisibility().
2.一般来说,整个过程更新一次地图即可。setMapStatus更新地图,只会以当前的 MapStatusUpdate来更新地图,覆盖过去的相关设置。animateMapStatus动画形式更新地图。添加addOverlay等直接在mMapView添加生效,在地图上显示。
方案:改用setMapStatus()就可以解决。??
原因:在Activity的OnCreate()执行完成以前,地图还没有显示。animateMapStatus的功能是以动画方式改变地图状态。显然,在地图还没显示时,不可能运行动画。
3.将多个点覆盖在视野内,LatLngBounds.Builder()。.include即可。
4.将xml转换为bitmap,当做marker显示。http://blog.csdn.net/jwzhangjie/article/details/36517719
5.不在xml文件中加入MapView,而是new控件,new MapView(this, mapOptions) http://www.tuicool.com/articles/Z77RVz
仅为参考:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mapview_container">
</FrameLayout>
<!-- <com.baidu.mapapi.map.MapView -->
<!-- android:id="@+id/bmapView" -->
<!-- android:layout_width="match_parent" -->
<!-- android:layout_height="match_parent" -->
<!-- android:clickable="true" /> -->
</RelativeLayout>
package com.example.baidutest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.WindowManager.LayoutParams;
import android.widget.FrameLayout;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMapOptions;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
public class MainActivity extends Activity {
private LocationClient mLocClient;
private MyLocationListenner myListener = new MyLocationListenner();
private LocationMode mCurrentMode;
boolean isFirstLoc = true;
private BitmapDescriptor mCurrentMarker;
private MapView mMapView;
private BaiduMap mBaiduMap;
private LatLng mCurrentLatLng;
private double mCurrentLatitude;
private double mCurrentLongtitude;
Handler mHandler;
LatLng point = new LatLng(36.312163, 122.097855);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mCurrentMode = LocationMode.NORMAL;
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
// 地图初始化
// mMapView = new MapView(this,
// new BaiduMapOptions().mapStatus(new MapStatus.Builder()
// .target(new LatLng(3,
// 106.751304)).build()));
// setContentView(mMapView);
// mBaiduMap = mMapView.getMap();
FrameLayout mapViewContainer = (FrameLayout) findViewById(R.id.mapview_container);
MapStatus mapStatus = new MapStatus.Builder()
.target( point )
.zoom(12).build();
BaiduMapOptions options = new BaiduMapOptions()
.zoomControlsEnabled(false).scaleControlEnabled(false)
.mapStatus(mapStatus);
mMapView = new MapView(this, options);
mapViewContainer.addView(mMapView, LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
// mMapView = (MapView) findViewById(R.id.bmapView);
// mapViewContainer = (FrameLayout) findViewById(R.id.mapview_container);
//
// MapStatus mapStatus = new MapStatus.Builder()
// .target(new LatLng(30.310607,
// 120.093059))
// .zoom(15).build();
//
// BaiduMapOptions options = new BaiduMapOptions()
// .zoomControlsEnabled(false).scaleControlEnabled(false)
// .mapStatus(mapStatus);
//
// MapView mapView = new MapView(this, options);
// mapViewContainer.addView(mapView, LayoutParams.MATCH_PARENT,
// LayoutParams.MATCH_PARENT);
// mMapView.setVisibility(View.INVISIBLE);
// MapStatus mapStatus = new MapStatus.Builder()
// .target(new LatLng(30.310607,
// 120.093059))
// .zoom(15).build();
mBaiduMap = mMapView.getMap();
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
mCurrentMode, true, mCurrentMarker));
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder()
// .target(new LatLng(30.310607,
// 120.093059)).build()));
// 定位初始化
mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gpsc
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
OverlayOptions option1 = new MarkerOptions().position(point).icon(mCurrentMarker);
mBaiduMap.addOverlay(option1);
// mBaiduMap.setMapStatus(MapStatusUpdateFactory
// .newMapStatus(new MapStatus.Builder()
// .zoom(mMapRoomLevel).build()));
// mHandler = new Handler();
// mHandler.postDelayed(new Runnable() {
//
// @Override
// public void run() {
// // TODO Auto-generated method stub
// mMapRoomLevel = getMapRoomLevel(mMaxDistance);
//
mBaiduMap.setMapStatus(MapStatusUpdateFactory
.newMapStatus(new MapStatus.Builder()
.zoom(mMapRoomLevel).build()));
// mBaiduMap.animateMapStatus(MapStatusUpdateFactory
// .newMapStatus(new MapStatus.Builder()
// .zoom(mMapRoomLevel).build()));
// }
// }, 1000);
}
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
mCurrentLatitude = location.getLatitude();
mCurrentLongtitude = location.getLongitude();
if (isFirstLoc) {
isFirstLoc = false;
mCurrentLatLng = new LatLng(mCurrentLatitude,
mCurrentLongtitude);
// MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mCurrentLatLng);
// mBaiduMap.animateMapStatus(u);
mMapView.setVisibility(View.VISIBLE);
LatLng point2 = new LatLng(32.314163, 120.069253);
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(mCurrentLatLng).include(point)
.include(point2);
LatLngBounds bounds = builder.build();
// mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder()
// .target(mCurrentLatLng).build()));
// mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder()
// .target(mCurrentLatLng).build()));
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngBounds(bounds);
mBaiduMap.animateMapStatus(u);
// mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder()
// .targt(mCurrentLatLng).build()));
OverlayOptions option2 = new MarkerOptions().position(point2).icon(mCurrentMarker);
mBaiduMap.addOverlay(option2);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
}