百度地图v3.5最新版本使用覆盖物,通用版。
2015-08-03 16:04
483 查看
好久没用百度地图了。以前用的是2.4.0,现在更新到3.5了,发现很多接口用不了,或者重构了。为此写了一份比较通用的项目。
项目资源地址:http://download.csdn.net/detail/u010090644/8956223
如需转载,请注明出处。http://blog.csdn.net/u010090644/article/details/47257651
如果下载后项目运行有误,可以评论私聊。
1.单个添加覆盖物 MapActivity主要代码
2.基类MFragment是继承Fragment的,至于为什么不继承SupportMapFragment是为了更好的在一般项目中通用。
有了以下个类就可以实现定位自己的位置,并添加单个覆盖物。上代码在说:
3.很多情况下不需要添加覆盖物,只需要定位。这里写了一个定位的Service.
4.重点来了,需要添加一个列表呢?多个覆盖物呢?以下代码来:
和MListFragment
5.此小demo里的MFragment, MListFragment在一般项目中很通用,需要的XML和LoaderCallbacks,有需要的话可以下载项目。
项目资源地址:http://download.csdn.net/detail/u010090644/8956223
如需转载,请注明出处。http://blog.csdn.net/u010090644/article/details/47257651
项目资源地址:http://download.csdn.net/detail/u010090644/8956223
如需转载,请注明出处。http://blog.csdn.net/u010090644/article/details/47257651
如果下载后项目运行有误,可以评论私聊。
1.单个添加覆盖物 MapActivity主要代码
public class MapAvtivity extends FragmentActivity{ private MyMapFragment map; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.my_map); FragmentManager fm = getSupportFragmentManager(); PUser user = new PUser(); user.setLatitude(25.856013); user.setLongitude(114.958339); map = MyMapFragment.newInstance(user); if (fm.findFragmentById(R.id.fragment) == null) { fm.beginTransaction().add(R.id.fragment, map).commit(); } } public static class MyMapFragment extends MFragment<PUser> implements OnMarkerClickListener{ public static MyMapFragment newInstance(PUser user) { MyMapFragment f = new MyMapFragment(); Bundle args = new Bundle(); args.putParcelable("user", user); f.setArguments(args); return f; } private PUser user; private Marker mMarkerA; private InfoWindow mInfoWindow; @Override public void onCreate(Bundle arg0) { super.onCreate(arg0); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); user = getArguments().getParcelable("user"); LatLng llA = new LatLng(user.getLatitude(), user.getLongitude()); BitmapDescriptor bdA = BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher); OverlayOptions over = new MarkerOptions().position(llA).icon(bdA) .zIndex(9).draggable(true); mBaiduMap.addOverlay(over); mBaiduMap.setOnMarkerClickListener(this); mMarkerA = (Marker) mBaiduMap.addOverlay(over); } @Override public Loader<PUser> onCreateLoader(int id, Bundle args) { return null; } @Override public boolean onMarkerClick(final Marker marker) { Button button = new Button(getActivity()); button.setBackgroundResource(R.drawable.popup); OnInfoWindowClickListener listener = null; if (marker == mMarkerA) { button.setText("更改位置"); listener = new OnInfoWindowClickListener() { public void onInfoWindowClick() { LatLng ll = marker.getPosition(); LatLng llNew = new LatLng(ll.latitude + 0.005, ll.longitude + 0.005); marker.setPosition(llNew); mBaiduMap.hideInfoWindow(); } }; LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), ll, -47, listener); mBaiduMap.showInfoWindow(mInfoWindow); } return true; } } }
2.基类MFragment是继承Fragment的,至于为什么不继承SupportMapFragment是为了更好的在一般项目中通用。
有了以下个类就可以实现定位自己的位置,并添加单个覆盖物。上代码在说:
public abstract class MFragment<T> extends Fragment implements LoaderCallbacks<T>, OnMapClickListener{ protected BaiduMap mBaiduMap; protected MapView mapView; public MyLocationListenner myListener = new MyLocationListenner(); private LocationClient mLocClient; private boolean isFirstLoc = true; @Override public void onCreate(Bundle arg0) { super.onCreate(arg0); getLoaderManager().initLoader(1, null, this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle arg2) { View v = inflater.inflate(R.layout.map, container, false); mapView = (MapView) v.findViewById(R.id.map); mBaiduMap = mapView.getMap(); mBaiduMap.setMyLocationEnabled(true); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f); mBaiduMap.setMapStatus(msu); mBaiduMap.setOnMapClickListener(this); mBaiduMap.setMaxAndMinZoomLevel(3, 20); mLocClient = new LocationClient(getActivity()); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setCoorType("bd09ll"); option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start(); return v; } public void forceLoad() { getLoaderManager().restartLoader(1, null, this); } public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null || mapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } public void onReceivePoi(BDLocation poiLocation) { } } @Override public void onStart() { super.onStart(); } @Override public void onResume() { super.onResume(); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override public void onPause() { super.onPause(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroy() { super.onDestroy(); // mBaiduMap.setMyLocationEnabled(false); // mapView.onDestroy(); // mapView = null; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override abstract public Loader<T> onCreateLoader(int id, Bundle args); @Override public void onLoadFinished(Loader<T> loader, T data) { } @Override public void onLoaderReset(Loader<T> loader) { } @Override public void onMapClick(LatLng arg0) { } @Override public boolean onMapPoiClick(MapPoi arg0) { String title = ""; if (arg0 != null){ title = arg0.getName(); Toast.makeText(getActivity(), title, Toast.LENGTH_SHORT).show(); } return false; } }
3.很多情况下不需要添加覆盖物,只需要定位。这里写了一个定位的Service.
public class BaiduLocationService extends Service { public static final String ACTION_LOCATION_CHANGED = "com.yundi.wlqc.service.action.location_changed"; private static final String TAG = "BaiduLocationService"; public boolean isAutoStopSelf; public LocationClient mLocationClient; public MyocationListenner myListener = new MyocationListenner(); private SDKReceiver mReceiver; public void onCreate() { super.onCreate(); SDKInitializer.initialize(getApplicationContext()); mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(myListener); IntentFilter iFilter = new IntentFilter(); iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); mReceiver = new SDKReceiver(); registerReceiver(mReceiver, iFilter); } public int onStartCommand(Intent intent, int flags, int startId) { if(!mLocationClient.isStarted()) { Log.d("BaiduLocationService", "Start locate"); LocationClientOption option = getLocationOption(); mLocationClient.setLocOption(option); mLocationClient.requestLocation(); mLocationClient.start(); } else { Log.d("BaiduLocationService", "Request locate"); mLocationClient.requestLocation(); } if(intent != null) { isAutoStopSelf = intent.getBooleanExtra("extra_stop", true); } return 0x1; } private LocationClientOption getLocationOption() { LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setCoorType("bd09ll"); option.setAddrType("all"); option.setScanSpan(1000); option.setIsNeedAddress(true); return option; } public void onDestroy() { super.onDestroy(); Log.d("BaiduLocationService", "Stop locate"); mLocationClient.stop(); } public IBinder onBind(Intent intent) { return null; } public class MyocationListenner implements BDLocationListener { public void onReceivePoi(BDLocation poiLocation) { } @Override public void onReceiveLocation(BDLocation location) { StringBuffer sb = new StringBuffer(256); if (location.getLocType() == BDLocation.TypeGpsLocation) { sb.append("GPS"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("Network"); } sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\naddr : "); sb.append(location.getAddrStr()); Log.i(TAG, sb.toString()); System.out.println(sb.toString()); Toast.makeText(getApplicationContext(), sb.toString(), Toast.LENGTH_SHORT).show(); writeLocationAndSendBroadcast(location); if (isAutoStopSelf) { stopSelf(); } } } private void writeLocationAndSendBroadcast(BDLocation bdlocation) { Location location = new Location("local"); location.setLatitude(bdlocation.getLatitude()); location.setLongitude(bdlocation.getLongitude()); LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); Intent intent = new Intent("com.yundi.wlqc.service.action.location_changed"); intent.putExtra("extra_location", location); intent.putExtra("exra_radius", bdlocation.getRadius()); // intent.putExtra("extra_derect", bdlocation.getDerect()); lbm.sendBroadcast(intent); } private Context getService() { return this; } public class SDKReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { Toast.makeText(getService(), "key error", Toast.LENGTH_SHORT) .show(); } if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { Toast.makeText(getService(), "network...", Toast.LENGTH_SHORT) .show(); } } } }
4.重点来了,需要添加一个列表呢?多个覆盖物呢?以下代码来:
public class MapListAvtivity extends FragmentActivity{ private MyMapFragment map; @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.my_map); FragmentManager fm = getSupportFragmentManager(); map = MyMapFragment.newInstance(); if (fm.findFragmentById(R.id.fragment) == null) { fm.beginTransaction().add(R.id.fragment, map).commit(); } } public static class MyMapFragment extends MListFragment<PUser> implements OnMarkerClickListener{ public static MyMapFragment newInstance() { MyMapFragment f = new MyMapFragment(); return f; } @Override protected List<PUser> loadData(Context context) throws Exception { List<PUser> list = new ArrayList<PUser>(); PUser user = new PUser(); user.setId("1"); user.setLatitude(25.856013); user.setLongitude(114.958339); list.add(user); PUser user1 = new PUser(); user1.setId("2"); user1.setLatitude(25.8444676614); user1.setLongitude(114.908875473); list.add(user1); PUser user2 = new PUser(); user2.setId("3"); user2.setLatitude(25.830770050254); user2.setLongitude(114.9804583851); list.add(user2); return list; } @Override protected OverlayOptions getOverlayItem(PUser item) { View v = View.inflate(getActivity(), R.layout.mdwd_map_item, null); TextView t_name = (TextView) v.findViewById(R.id.t_name); t_name.setText(item.getLatitude()+ ""); // BitmapDrawable b = new BitmapDrawable(getResources(), // ViewUtils.getBitmapFromView(v)); LatLng l = new LatLng(item.getLatitude(), item.getLongitude()); BitmapDescriptor bdA = BitmapDescriptorFactory.fromView(v); Bundle b = new Bundle(); b.putParcelable("user", item); OverlayOptions o = new MarkerOptions().position(l). icon(bdA).zIndex(9).draggable(true).extraInfo(b); mBaiduMap.setOnMarkerClickListener(this); return o; } @Override public boolean onMarkerClick(Marker arg0) { for(Marker m : markers){ if(arg0 == m){ PUser user = arg0.getExtraInfo().getParcelable("user"); Toast.makeText(getActivity(), user.getId(), Toast.LENGTH_SHORT).show(); } } return true; } } }
和MListFragment
public abstract class MListFragment<T> extends MFragment<List<T>> { private Exception ex; private OverlayManager overlayManager; protected List<OverlayOptions> overlayOptions; protected List<Marker> markers; @Override public Loader<List<T>> onCreateLoader(int id, Bundle args) { return new ListAsyncTaskLoader<T>(getActivity()) { @Override protected List<T> loadInBackground(Context context) { try { return loadData(context); } catch (Exception e) { e.printStackTrace(); ex = e; } return null; } }; } @Override public void onLoadFinished(Loader<List<T>> loader, List<T> data) { super.onLoadFinished(loader, data); if (ex != null) { ex = null; return; } overlayOptions = new ArrayList<OverlayOptions>(); markers = new ArrayList<Marker>(); for (int i = 0; i < data.size(); i++) { OverlayOptions item = getOverlayItem(data.get(i)); overlayOptions.add(item); Marker m = (Marker) mBaiduMap.addOverlay(item); markers.add(m); } } abstract protected List<T> loadData(Context context) throws Exception; abstract protected OverlayOptions getOverlayItem(T item); public List<OverlayOptions> getOverlayOptions() { return overlayOptions; } public void setOverlayOptions(List<OverlayOptions> overlayOptions) { this.overlayOptions = overlayOptions; } }
5.此小demo里的MFragment, MListFragment在一般项目中很通用,需要的XML和LoaderCallbacks,有需要的话可以下载项目。
项目资源地址:http://download.csdn.net/detail/u010090644/8956223
如需转载,请注明出处。http://blog.csdn.net/u010090644/article/details/47257651
相关文章推荐
- JS中引用百度地图并将百度地图的logo和信息去掉
- 百度地图自定义控件分享
- javascript实现百度地图鼠标滑动事件显示、隐藏
- 百度地图api如何使用
- 比例尺、缩略图、平移缩放之百度地图添加控件方法
- Android下如何使用百度地图sdk
- 百度地图api应用标注地理位置信息(js版)
- Android百度地图HelloWorld运行异常处理
- 关于百度地图坐标转换接口的研究
- Android百度地图添加多个自定义的覆盖物-日记
- 魏凯明:LBS应用开发的免费大餐
- Android百度地图开发
- 掌控移动入口:互联网手机的伪命题?
- [应用模板]PhonegapGPS+百度地图
- 百度地图引用api实例
- 百度地图开源库
- 百度地图API
- 百度地图上将每个省着不同的颜色
- JSP页面添加百度地图
- 百度地图SDK初步学习——环境配置