package me.gfuil.bmap.lite.fragment; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.Point; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.widget.CardView; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ListView; import android.widget.Toast; import com.amap.api.services.core.SuggestionCity; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapBaseIndoorMapInfo; import com.baidu.mapapi.map.MapPoi; 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.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.Overlay; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.overlayutil.BusLineOverlay; import com.baidu.mapapi.search.busline.BusLineResult; import com.baidu.mapapi.search.busline.BusLineSearch; import com.baidu.mapapi.search.busline.BusLineSearchOption; import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.utils.DistanceUtil; import java.util.ArrayList; import java.util.List; import me.gfuil.bmap.lite.BApp; import me.gfuil.bmap.lite.R; import me.gfuil.bmap.lite.activity.MainActivity; import me.gfuil.bmap.lite.adapter.BaiduIndoorInfoAdapter; import me.gfuil.bmap.lite.base.BaseFragment; import me.gfuil.bmap.lite.interacter.CacheInteracter; import me.gfuil.bmap.lite.interacter.ConfigInteracter; import me.gfuil.bmap.lite.interacter.FavoriteInteracter; import me.gfuil.bmap.lite.interacter.SearchInteracter; import me.gfuil.bmap.lite.listener.MyOrientationListener; import me.gfuil.bmap.lite.listener.OnSearchResultListener; import me.gfuil.bmap.lite.model.MyPoiModel; import me.gfuil.bmap.lite.model.TypeMap; import me.gfuil.bmap.lite.model.TypePoi; import me.gfuil.bmap.lite.utils.AppUtils; import me.gfuil.bmap.lite.utils.StatusBarUtils; /** * 百度地图 * * @author gfuil */ public class BaiduMapFragment extends BaseFragment implements BaiduMap.OnMapClickListener, BaiduMap.OnMapLoadedCallback, BaiduMap.OnMarkerClickListener, BaiduMap.OnMapLongClickListener, MyOrientationListener.OnOrientationListener, OnGetBusLineSearchResultListener, View.OnClickListener, OnSearchResultListener, BaiduMap.OnMyLocationClickListener, BaiduMap.OnMapStatusChangeListener, BDLocationListener, BaiduMap.OnBaseIndoorMapListener, AdapterView.OnItemClickListener { private MapView mMapView; private BaiduMap mBaiduMap; private LocationClient mLocClient; private CardView mCardZoom, mCardFloor; private ListView mListFloors; private Button mBtnZoomIn, mBtnZoomOut; private FloatingActionButton btnLocation; private boolean isFirstLoc = true; // 是否首次定位 private boolean isRequest = false;//是否手动触发请求定位 private MyOrientationListener myOrientationListener; private int mXDirection = -1; private MyPoiModel clickMapPoiNow; public TypePoi mTypePoi; private SearchInteracter mSearchInteracter; private List<Overlay> mFavMarkerList = new ArrayList<>(); private List<MyPoiModel> mPoiList = new ArrayList<>(); private List<Overlay> mOverlayList = new ArrayList<>(); private double mTotal = 0; private FavoriteInteracter mFavoriteInteracter; private boolean mIsModeRanging = false; private boolean mIsModeEDog = false; public boolean isModeRanging() { return mIsModeRanging; } public void setModeRanging(boolean enabled) { mIsModeRanging = enabled; clearRangingPoi(); } public boolean isModeEDog() { return mIsModeEDog; } public static BaiduMapFragment newInstance() { return new BaiduMapFragment(); } public BaiduMapFragment() { } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_map_baidu, container, false); initView(view); getData(); return view; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override public void onDestroyView() { // 关闭定位图层 if (null != mBaiduMap) { mBaiduMap.hideInfoWindow(); mBaiduMap.setMyLocationEnabled(false); } if (null != mMapView) { MapView.setMapCustomEnable(false); mMapView.onDestroy(); mMapView = null; } if (null != mSearchInteracter) { mSearchInteracter.destroy(); } if (null != mFavoriteInteracter) { mFavoriteInteracter.destroy(); } super.onDestroyView(); } @Override public void onResume() { mMapView.onResume(); if (null != mLocClient && !mLocClient.isStarted()) { mLocClient.start(); } myOrientationListener.start(); configMap(); super.onResume(); } @Override public void onPause() { mMapView.onPause(); if (null != mLocClient && mLocClient.isStarted()) { mLocClient.stop(); } myOrientationListener.stop(); super.onPause(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (MainActivity.REQUEST_SEARCH == resultCode) { if (null != data && null != data.getExtras()) { List<MyPoiModel> poiAll = data.getExtras().getParcelableArrayList("poiAll"); MyPoiModel poiInfo = data.getExtras().getParcelable("poi"); int position = data.getExtras().getInt("position"); if (null != poiInfo) { if (poiInfo.getTypePoi() == TypePoi.BUS_LINE || poiInfo.getTypePoi() == TypePoi.SUBWAY_LINE) { mTypePoi = poiInfo.getTypePoi(); searchBusLine(poiInfo.getCity(), poiInfo.getUid()); ((MainActivity) getActivity()).showPoiLay(null, -1); } else { mTypePoi = null; clickMapPoiNow = poiInfo; makeMarker(clickMapPoiNow, true); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(clickMapPoiNow.getLatitude(), clickMapPoiNow.getLongitude()))); } } else if (null != poiAll && !poiAll.isEmpty()) { clearMarker(); ((MainActivity) getActivity()).showPoiLay(null, -1); // LatLngBounds.Builder builder = new LatLngBounds.Builder(); // int length = 10 > poiAll.size() ? poiAll.size() : 10; // for (int i = 0; i < length; i++) { // if (poiAll.get(i).getTypePoi() == TypePoi.POINT || (poiAll.get(i).getLatitude() != 0 && poiAll.get(i).getLongitude() != 0)) { // makeMarker(poiAll.get(i), false, i + 1); // LatLng ll = new LatLng(poiAll.get(i).getLatitude(), poiAll.get(i).getLongitude()); // builder.include(ll); // } // // } mTypePoi = null; clickMapPoiNow = poiAll.get(position); makeMarker(clickMapPoiNow, false); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(clickMapPoiNow.getLatitude(), clickMapPoiNow.getLongitude()))); // mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(poiAll.get(position).getLatitude()-0.001, poiAll.get(position).getLongitude()))); } } } } private void getData() { myOrientationListener = new MyOrientationListener(getActivity()); myOrientationListener.setOnOrientationListener(this); mSearchInteracter = new SearchInteracter(getActivity(), TypeMap.TYPE_BAIDU); mFavoriteInteracter = new FavoriteInteracter(getActivity()); } @Override protected void initView(View view) { btnLocation = getView(view, R.id.btn_location); mMapView = getView(view, R.id.map_baidu); mBtnZoomIn = getView(view, R.id.btn_zoom_in); mBtnZoomOut = getView(view, R.id.btn_zoom_out); mCardZoom = getView(view, R.id.card_zoom); mCardFloor = getView(view, R.id.card_floor); mListFloors = getView(view, R.id.list_floors); btnLocation.setOnClickListener(this); mBtnZoomIn.setOnClickListener(this); mBtnZoomOut.setOnClickListener(this); mListFloors.setOnItemClickListener(this); // 地图初始化 mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 开启室内图 mBaiduMap.setIndoorEnable(true); mBaiduMap.setOnMapClickListener(this); mBaiduMap.setOnMapLoadedCallback(this); mBaiduMap.setOnMarkerClickListener(this); mBaiduMap.setOnMapLongClickListener(this); mBaiduMap.setOnMyLocationClickListener(this); mBaiduMap.setOnMapStatusChangeListener(this); mBaiduMap.setOnBaseIndoorMapListener(this); } public void initLocationSdk() { // 定位初始化 mLocClient = new LocationClient(getActivity()); mLocClient.registerLocationListener(this); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setCoorType("gcj02"); option.setOpenGps(true); option.setScanSpan(1000); option.setIsNeedAltitude(true); option.setIsNeedAddress(false); mLocClient.setLocOption(option); MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null); mBaiduMap.setMyLocationConfiguration(configuration); mLocClient.start(); try { LocationManager locManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (!locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { onMessage(getResources().getString(R.string.gps_enabled_false)); } } catch (Exception e) { e.printStackTrace(); } } int clickLocNum = 0; public void requestLoc() { if (clickLocNum++ > 1) { clickLocNum = 0; } if (null != BApp.MY_LOCATION) { // ((MainActivity)getActivity()).showPoiLay(BApp.MY_LOCATION, -1); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(new LatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude())).zoom(18f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } if (null != mBaiduMap.getLocationConfiguration()) { if (mBaiduMap.getLocationConfiguration().locationMode == MyLocationConfiguration.LocationMode.COMPASS) { mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null)); btnLocation.setImageResource(R.drawable.ic_my_location_24dp); MapStatus.Builder builder = new MapStatus.Builder().rotate(0).overlook(90); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } else { if (clickLocNum == 2) { mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, null)); btnLocation.setImageResource(R.drawable.ic_explore_24dp); Toast.makeText(getActivity(), "罗盘模式", Toast.LENGTH_SHORT).show(); } } } isRequest = true; if (null != mLocClient) { mLocClient.start(); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 授权 ((MainActivity) getActivity()).verifyPermissions(); } else { initLocationSdk(); } } } public void searchBusLine(String city, String uid) { BusLineSearch busLineSearch = BusLineSearch.newInstance(); busLineSearch.setOnGetBusLineSearchResultListener(this); busLineSearch.searchBusLine(new BusLineSearchOption().city(city).uid(uid)); } @Override public void onMapLoaded() { int statusHeight = StatusBarUtils.getStatusBarHeight(getActivity()); mBaiduMap.setCompassPosition(new Point(AppUtils.dip2Px(getActivity(), 30), statusHeight + AppUtils.dip2Px(getActivity(), 90))); configMap(); setCacheMapStatus(); clearMarker(); getFavoriteList(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ((MainActivity) getActivity()).verifyPermissions(); } else { initLocationSdk(); } } public void getFavoriteList() { if (null != mFavMarkerList && !mFavMarkerList.isEmpty()) { for (Overlay o : mFavMarkerList) { o.remove(); } mFavMarkerList.clear(); } if (null != mFavoriteInteracter) { List<MyPoiModel> favoriteList = mFavoriteInteracter.getFavoriteList(); if (null != favoriteList && !favoriteList.isEmpty()) { for (MyPoiModel poi : favoriteList) { //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_grade_point); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().title(poi.getName()).position(new LatLng(poi.getLatitude(), poi.getLongitude())).icon(bitmap).animateType(MarkerOptions.MarkerAnimateType.none).anchor(0.5f, 0.5f); //在地图上添加Marker,并显示 mFavMarkerList.add(mBaiduMap.addOverlay(option)); } } } } private void configMap() { ConfigInteracter configInteracter = new ConfigInteracter(getActivity()); mBaiduMap.getUiSettings().setZoomGesturesEnabled(configInteracter.isZoomGesturesEnabled()); mBaiduMap.getUiSettings().setOverlookingGesturesEnabled(configInteracter.isOverlookEnable()); mBaiduMap.getUiSettings().setRotateGesturesEnabled(configInteracter.isRotateEnable()); mMapView.showScaleControl(configInteracter.isShowScaleControl()); mBaiduMap.showMapPoi(configInteracter.isMapPoiEnable()); mBaiduMap.setTrafficEnabled(configInteracter.isTrafficEnable()); if (configInteracter.getNightMode() == 2) { MapView.setMapCustomEnable(true); } else { MapView.setMapCustomEnable(false); } mMapView.showZoomControls(false); // mBaiduMap.setMaxAndMinZoomLevel(20f, 3f); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams(AppUtils.dip2Px(getActivity(), 36), ViewGroup.LayoutParams.WRAP_CONTENT); if (configInteracter.getZoomControlsPosition()) { params.rightMargin = AppUtils.dip2Px(getActivity(), 10); params.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT; params2.leftMargin = AppUtils.dip2Px(getActivity(), 10); params2.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT; } else { params.leftMargin = AppUtils.dip2Px(getActivity(), 10); params.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT; params2.rightMargin = AppUtils.dip2Px(getActivity(), 10); params2.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT; } mCardZoom.setLayoutParams(params); mCardFloor.setLayoutParams(params2); } private void setCacheMapStatus() { CacheInteracter cacheInteracter = new CacheInteracter(getActivity()); LatLng latLng = new LatLng(cacheInteracter.getLatitude(), cacheInteracter.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(latLng).zoom(14.5f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_location: requestLoc(); break; case R.id.btn_zoom_in: if (mBaiduMap.getMaxZoomLevel() > mBaiduMap.getMapStatus().zoom) { MapStatus.Builder builder = new MapStatus.Builder(); builder.zoom(mBaiduMap.getMapStatus().zoom + 1f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } break; case R.id.btn_zoom_out: if (mBaiduMap.getMinZoomLevel() < mBaiduMap.getMapStatus().zoom) { MapStatus.Builder builder = new MapStatus.Builder(); builder.zoom(mBaiduMap.getMapStatus().zoom - 1f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } break; } } @Override public void onMapClick(LatLng latLng) { if (mIsModeRanging) { MyPoiModel poi = new MyPoiModel(TypeMap.TYPE_BAIDU); poi.setLatitude(latLng.latitude); poi.setLongitude(latLng.longitude); if (null == mPoiList) { mPoiList = new ArrayList<>(); } mPoiList.add(poi); makeRangingMarker(poi); setRangingPolyLine(); } else { ((MainActivity) getActivity()).showPoiLay(null, -1); } } @Override public boolean onMapPoiClick(MapPoi mapPoi) { if (mIsModeRanging) { MyPoiModel poi = new MyPoiModel(TypeMap.TYPE_BAIDU); poi.setLatitude(mapPoi.getPosition().latitude); poi.setLongitude(mapPoi.getPosition().longitude); if (null == mPoiList) { mPoiList = new ArrayList<>(); } mPoiList.add(poi); makeRangingMarker(poi); setRangingPolyLine(); } else { if (null == clickMapPoiNow) { clickMapPoiNow = new MyPoiModel(TypeMap.TYPE_BAIDU); } clickMapPoiNow.setTypeMap(TypeMap.TYPE_BAIDU); clickMapPoiNow.setName(mapPoi.getName()); clickMapPoiNow.setUid(mapPoi.getUid()); clickMapPoiNow.setLatitude(mapPoi.getPosition().latitude); clickMapPoiNow.setLongitude(mapPoi.getPosition().longitude); makeMarker(clickMapPoiNow, true); } ((MainActivity) getActivity()).showSearchResultLay(false); return true; } @Override public boolean onMarkerClick(Marker marker) { if (mIsModeRanging) { MyPoiModel poi = new MyPoiModel(TypeMap.TYPE_BAIDU); poi.setLatitude(marker.getPosition().latitude); poi.setLongitude(marker.getPosition().longitude); if (null == mPoiList) { mPoiList = new ArrayList<>(); } mPoiList.add(poi); makeRangingMarker(poi); setRangingPolyLine(); } else { int distance = 0; if (null != BApp.MY_LOCATION) { distance = (int) DistanceUtil.getDistance(new LatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude()), marker.getPosition()); } if (null == clickMapPoiNow) { clickMapPoiNow = new MyPoiModel(TypeMap.TYPE_BAIDU); } clickMapPoiNow.setTypeMap(TypeMap.TYPE_BAIDU); clickMapPoiNow.setName(marker.getTitle()); clickMapPoiNow.setLongitude(marker.getPosition().longitude); clickMapPoiNow.setLatitude(marker.getPosition().latitude); ((MainActivity) getActivity()).showPoiLay(clickMapPoiNow, distance); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(new LatLng(clickMapPoiNow.getLatitude(), clickMapPoiNow.getLongitude()))); } return true; } @Override public void onMapLongClick(LatLng latLng) { if (mIsModeRanging) { MyPoiModel poi = new MyPoiModel(TypeMap.TYPE_BAIDU); poi.setLatitude(latLng.latitude); poi.setLongitude(latLng.longitude); if (null == mPoiList) { mPoiList = new ArrayList<>(); } mPoiList.add(poi); makeRangingMarker(poi); setRangingPolyLine(); } else { if (null == clickMapPoiNow) { clickMapPoiNow = new MyPoiModel(TypeMap.TYPE_BAIDU); } clickMapPoiNow.setTypeMap(TypeMap.TYPE_BAIDU); clickMapPoiNow.setName("地图上的点"); clickMapPoiNow.setLatitude(latLng.latitude); clickMapPoiNow.setLongitude(latLng.longitude); makeMarker(clickMapPoiNow, true); } } private void makeMarker(MyPoiModel poi, boolean isClear, int number) { if (isClear) { clearMarker(); } if (0 < number && 11 > number) { //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + number + ".png"); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().title(poi.getName()).position(new LatLng(poi.getLatitude(), poi.getLongitude())).icon(bitmap).animateType(MarkerOptions.MarkerAnimateType.none); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); if (1 == number) { int distance = 0; if (null != BApp.MY_LOCATION) { distance = (int) DistanceUtil.getDistance(new LatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude()), new LatLng(poi.getLatitude(), poi.getLongitude())); } ((MainActivity) getActivity()).showPoiLay(poi, distance); } } else { //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().title(poi.getName()).position(new LatLng(poi.getLatitude(), poi.getLongitude())).icon(bitmap).animateType(MarkerOptions.MarkerAnimateType.none); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(new LatLng(poi.getLatitude(), poi.getLongitude())); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } } private void makeMarker(MyPoiModel poi, boolean isClear) { // if (isClear) { // clearMarker(); // } // // //构建Marker图标 // BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding); // //构建MarkerOption,用于在地图上添加Marker // OverlayOptions option = new MarkerOptions().title(poi.getName()).position(poi.getLatLngBaidu(getActivity())).icon(bitmap).animateType(MarkerOptions.MarkerAnimateType.none); // //在地图上添加Marker,并显示 // mBaiduMap.addOverlay(option); // // MapStatus.Builder builder = new MapStatus.Builder(); // builder.target(poi.getLatLngBaidu(getActivity())); // mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); makeMarker(poi, isClear, 0); int distance = 0; if (null != BApp.MY_LOCATION) { distance = (int) DistanceUtil.getDistance(new LatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude()), new LatLng(poi.getLatitude(), poi.getLongitude())); } ((MainActivity) getActivity()).showPoiLay(poi, distance); } public void clearMarker() { mBaiduMap.clear(); getFavoriteList(); } @Override public void onOrientationChanged(float x) { mXDirection = (int) x; if (null != mBaiduMap && null != mBaiduMap.getLocationData()) { MyLocationData locData = new MyLocationData.Builder() .direction(mXDirection) .latitude(mBaiduMap.getLocationData().latitude) .longitude(mBaiduMap.getLocationData().longitude) .accuracy(mBaiduMap.getLocationData().accuracy) .build(); mBaiduMap.setMyLocationData(locData); } } @Override public void onGetBusLineResult(BusLineResult result) { hideProgress(); if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { onMessage("未找到路线"); } else { clearMarker(); BusLineOverlay overlay = new BusLineOverlay(mBaiduMap, PoiInfo.POITYPE.fromInt(mTypePoi.getInt())); mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result); overlay.addToMap(); overlay.zoomToSpan(); } } public int getMapType() { return mBaiduMap.getMapType(); } public void setMapType(int mapType) { mBaiduMap.setMapType(mapType); } public MapStatus getMapStatus() { return mBaiduMap.getMapStatus(); } public void animateMapStatus(MapStatusUpdate mapStatusUpdate) { mBaiduMap.animateMapStatus(mapStatusUpdate); } public boolean isTrafficEnabled() { return mBaiduMap.isTrafficEnabled(); } public void setTrafficEnabled(boolean trafficEnabled) { mBaiduMap.setTrafficEnabled(trafficEnabled); } @Override public void setSearchResult(List<MyPoiModel> list) { if (null != list && !list.isEmpty()) { if (null == BApp.MY_LOCATION) { BApp.MY_LOCATION = new MyPoiModel(BApp.TYPE_MAP); } BApp.MY_LOCATION.setCity(list.get(0).getCity()); BApp.MY_LOCATION.setName("我的位置"); if (null != getActivity()) { CacheInteracter cacheInteracter = new CacheInteracter(getActivity()); cacheInteracter.setCity(BApp.MY_LOCATION.getCity()); } } } @Override public void setSuggestCityList(List<SuggestionCity> cities) { } @Override public boolean onMyLocationClick() { ((MainActivity) getActivity()).showPoiLay(BApp.MY_LOCATION, 0); return true; } @Override public void onMapStatusChangeStart(MapStatus mapStatus) { } @Override public void onMapStatusChangeStart(MapStatus mapStatus, int i) { } @Override public void onMapStatusChange(MapStatus mapStatus) { } @Override public void onMapStatusChangeFinish(MapStatus mapStatus) { if (mBaiduMap.getMaxZoomLevel() <= mapStatus.zoom) { mBtnZoomIn.setTextColor(Color.parseColor("#bbbbbb")); mBtnZoomIn.setEnabled(false); } else if (mBaiduMap.getMinZoomLevel() >= mapStatus.zoom) { mBtnZoomOut.setTextColor(Color.parseColor("#bbbbbb")); mBtnZoomOut.setEnabled(false); } else { mBtnZoomOut.setTextColor(Color.parseColor("#757575")); mBtnZoomOut.setEnabled(true); mBtnZoomIn.setTextColor(Color.parseColor("#757575")); mBtnZoomIn.setEnabled(true); } } public void setBtnLocationTranslationY(float v) { if (null != btnLocation) { btnLocation.setTranslationY(v); } } private void makeRangingMarker(MyPoiModel poi) { //构建Marker图标 ImageView imageView = new ImageView(getActivity()); imageView.setImageResource(R.drawable.shape_point); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(imageView); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().title(poi.getName()) .position(new LatLng(poi.getLatitude(), poi.getLongitude())).icon(bitmap) .animateType(MarkerOptions.MarkerAnimateType.none).anchor(0.5f, 0.5f); //在地图上添加Marker,并显示 Overlay marker = mBaiduMap.addOverlay(option); mOverlayList.add(marker); } public void setRangingPolyLine() { if (null == mPoiList || mPoiList.size() < 2) { mTotal = 0; ((MainActivity) getActivity()).setRangingDistance(mTotal); return; } MyPoiModel end = mPoiList.get(mPoiList.size() - 1); MyPoiModel last = mPoiList.get(mPoiList.size() - 2); mTotal += DistanceUtil.getDistance(new LatLng(end.getLatitude(), end.getLongitude()), new LatLng(last.getLatitude(), last.getLongitude())); List<LatLng> points = new ArrayList<>(); points.add(new LatLng(end.getLatitude(), end.getLongitude())); points.add(new LatLng(last.getLatitude(), last.getLongitude())); OverlayOptions ooPolyline = new PolylineOptions().width(6).color(Color.BLUE).points(points); Overlay line = mBaiduMap.addOverlay(ooPolyline); if (mOverlayList == null) { mOverlayList = new ArrayList<>(); } mOverlayList.add(line); ((MainActivity) getActivity()).setRangingDistance(mTotal); } public void deleteRangingPoi() { if (null == mPoiList || mOverlayList == null) { return; } if (mPoiList.size() > 1) { MyPoiModel end = mPoiList.get(mPoiList.size() - 1); MyPoiModel pre = mPoiList.get(mPoiList.size() - 2); mTotal -= DistanceUtil.getDistance(new LatLng(end.getLatitude(), end.getLongitude()), new LatLng(pre.getLatitude(), pre.getLongitude())); mPoiList.remove(mPoiList.size() - 1); ((MainActivity) getActivity()).setRangingDistance(mTotal); } else if (mPoiList.size() == 1) { mPoiList.remove(mPoiList.size() - 1); mTotal = 0; ((MainActivity) getActivity()).setRangingDistance(mTotal); } if (!mOverlayList.isEmpty()) { mOverlayList.get(mOverlayList.size() - 1).remove(); mOverlayList.remove(mOverlayList.size() - 1); } if (!mOverlayList.isEmpty()) { mOverlayList.get(mOverlayList.size() - 1).remove(); mOverlayList.remove(mOverlayList.size() - 1); } } public void clearRangingPoi() { mBaiduMap.clear(); if (mPoiList != null) { mPoiList.clear(); } if (mOverlayList != null) { mOverlayList.clear(); } mTotal = 0; } @Override public void onMessage(String msg) { hideProgress(); Snackbar.make(btnLocation, msg, Snackbar.LENGTH_SHORT).show(); } @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) { return; } if (null == BApp.MY_LOCATION) { BApp.MY_LOCATION = new MyPoiModel(TypeMap.TYPE_BAIDU); } BApp.MY_LOCATION.setName("我的位置"); BApp.MY_LOCATION.setLatitude(location.getLatitude()); BApp.MY_LOCATION.setLongitude(location.getLongitude()); BApp.MY_LOCATION.setAltitude(location.getAltitude()); BApp.MY_LOCATION.setAccuracy(location.getRadius()); CacheInteracter interacter = new CacheInteracter(getActivity()); if (BApp.MY_LOCATION.getLongitude() == 0 || BApp.MY_LOCATION.getLatitude() == 0 || BApp.MY_LOCATION.getLongitude() == 4.9E-324 || BApp.MY_LOCATION.getLatitude() == 4.9E-324) { BApp.MY_LOCATION.setLatitude(interacter.getLatitude()); BApp.MY_LOCATION.setLongitude(interacter.getLongitude()); } MyLocationData locData = new MyLocationData.Builder() .direction(mXDirection) .latitude(BApp.MY_LOCATION.getLatitude()) .longitude(BApp.MY_LOCATION.getLongitude()) .accuracy((float) BApp.MY_LOCATION.getAccuracy()) .build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc || isRequest) { if (location.getLatitude() == 0 || location.getLongitude() == 0 || location.getLatitude() == 4.9E-324 || location.getLongitude() == 4.9E-324) { onMessage("无法获取到位置信息,请连接网络后再试"); } MapStatus.Builder builder = new MapStatus.Builder(); builder.target(new LatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude())).zoom(18f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); mSearchInteracter.searchLatLng(BApp.MY_LOCATION.getLatitude(), BApp.MY_LOCATION.getLongitude(), 1, this); interacter.setLatitude(BApp.MY_LOCATION.getLatitude()); interacter.setLongitude(BApp.MY_LOCATION.getLongitude()); if (isFirstLoc) { ((MainActivity) getActivity()).firstLocationComplete(); isFirstLoc = false; } isRequest = false; } } public void setModeEDog(boolean isChecked) { if (isChecked) { if (null != mBaiduMap.getLocationConfiguration() && mBaiduMap.getLocationConfiguration().locationMode != MyLocationConfiguration.LocationMode.COMPASS) { mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, null)); btnLocation.setImageResource(R.drawable.ic_explore_24dp); } mIsModeEDog = true; } else { if (null != mBaiduMap.getLocationConfiguration() && mBaiduMap.getLocationConfiguration().locationMode == MyLocationConfiguration.LocationMode.COMPASS) { mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null)); btnLocation.setImageResource(R.drawable.ic_my_location_24dp); MapStatus.Builder builder = new MapStatus.Builder().rotate(0).overlook(90); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } mIsModeEDog = false; } } private BaiduIndoorInfoAdapter mIndoorInfoAdapter; @Override public void onBaseIndoorMapMode(boolean b, MapBaseIndoorMapInfo info) { if (b && null != info) { //进入室内图 mCardFloor.setVisibility(View.VISIBLE); if (mIndoorInfoAdapter == null) { mIndoorInfoAdapter = new BaiduIndoorInfoAdapter(getActivity(), info.getFloors(), info.getCurFloor(), info.getID()); mListFloors.setAdapter(mIndoorInfoAdapter); } else { mIndoorInfoAdapter.setFloorId(info.getID()); mIndoorInfoAdapter.setList(info.getFloors()); mIndoorInfoAdapter.setCurFloor(info.getCurFloor()); mIndoorInfoAdapter.notifyDataSetChanged(); } } else { //移出室内图 mCardFloor.setVisibility(View.GONE); mIndoorInfoAdapter = null; mListFloors.setAdapter(mIndoorInfoAdapter); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (parent.getId() == R.id.list_floors) { mIndoorInfoAdapter.setCurFloor((String) mIndoorInfoAdapter.getItem(position)); mIndoorInfoAdapter.notifyDataSetChanged(); ((MainActivity) getActivity()).showPoiLay(null, 0); if (null != mIndoorInfoAdapter.getFloorId()) { mBaiduMap.switchBaseIndoorMapFloor(mIndoorInfoAdapter.getCurFloor(), mIndoorInfoAdapter.getFloorId()); } } } public void showOtherPoi(MyPoiModel poi) { isFirstLoc = false; makeMarker(poi, true); } }