package com.baidu.mapapi.overlayutil; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.Overlay; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.Polyline; import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.search.route.TransitRouteLine; import java.util.ArrayList; import java.util.List; /** * 用于显示换乘路线的Overlay,自3.4.0版本起可实例化多个添加在地图中显示 */ public class TransitRouteOverlay extends OverlayManager { private TransitRouteLine mRouteLine = null; /** * 构造函数 * * @param baiduMap * 该TransitRouteOverlay引用的 BaiduMap 对象 */ public TransitRouteOverlay(BaiduMap baiduMap) { super(baiduMap); } @Override public final List<OverlayOptions> getOverlayOptions() { if (mRouteLine == null) { return null; } List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>(); // step node if (mRouteLine.getAllStep() != null && mRouteLine.getAllStep().size() > 0) { for (TransitRouteLine.TransitStep step : mRouteLine.getAllStep()) { Bundle b = new Bundle(); b.putInt("index", mRouteLine.getAllStep().indexOf(step)); if (step.getEntrance() != null) { overlayOptionses.add((new MarkerOptions()) .position(step.getEntrance().getLocation()) .anchor(0.5f, 0.5f).zIndex(10).extraInfo(b) .icon(getIconForStep(step))); } // 最后路段绘制出口点 if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine .getAllStep().size() - 1) && step.getExit() != null) { overlayOptionses.add((new MarkerOptions()) .position(step.getExit().getLocation()) .anchor(0.5f, 0.5f).zIndex(10) .icon(getIconForStep(step))); } } } if (mRouteLine.getStarting() != null) { overlayOptionses.add((new MarkerOptions()) .position(mRouteLine.getStarting().getLocation()) .icon(getStartMarker() != null ? getStartMarker() : BitmapDescriptorFactory .fromAssetWithDpi("Icon_start.png")).zIndex(10)); } if (mRouteLine.getTerminal() != null) { overlayOptionses .add((new MarkerOptions()) .position(mRouteLine.getTerminal().getLocation()) .icon(getTerminalMarker() != null ? getTerminalMarker() : BitmapDescriptorFactory .fromAssetWithDpi("Icon_end.png")) .zIndex(10)); } // polyline if (mRouteLine.getAllStep() != null && mRouteLine.getAllStep().size() > 0) { for (TransitRouteLine.TransitStep step : mRouteLine.getAllStep()) { if (step.getWayPoints() == null) { continue; } int color = 0; if (step.getStepType() != TransitRouteLine.TransitStep.TransitRouteStepType.WAKLING) { // color = Color.argb(178, 0, 78, 255); color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255); } else { // color = Color.argb(178, 88, 208, 0); color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 88, 208, 0); } overlayOptionses.add(new PolylineOptions() .points(step.getWayPoints()).width(10).color(color) .zIndex(0)); } } return overlayOptionses; } private BitmapDescriptor getIconForStep(TransitRouteLine.TransitStep step) { switch (step.getStepType()) { case BUSLINE: return BitmapDescriptorFactory.fromAssetWithDpi("Icon_bus_station.png"); case SUBWAY: return BitmapDescriptorFactory.fromAssetWithDpi("Icon_subway_station.png"); case WAKLING: return BitmapDescriptorFactory.fromAssetWithDpi("Icon_walk_route.png"); default: return null; } } /** * 设置路线数据 * * @param routeOverlay * 路线数据 */ public void setData(TransitRouteLine routeOverlay) { this.mRouteLine = routeOverlay; } /** * 覆写此方法以改变默认起点图标 * * @return 起点图标 */ public BitmapDescriptor getStartMarker() { return null; } /** * 覆写此方法以改变默认终点图标 * * @return 终点图标 */ public BitmapDescriptor getTerminalMarker() { return null; } public int getLineColor() { return 0; } /** * 覆写此方法以改变起默认点击行为 * * @param i * 被点击的step在 * {@link com.baidu.mapapi.search.route.TransitRouteLine#getAllStep()} * 中的索引 * @return 是否处理了该点击事件 */ public boolean onRouteNodeClick(int i) { if (mRouteLine.getAllStep() != null && mRouteLine.getAllStep().get(i) != null) { Log.i("baidumapsdk", "TransitRouteOverlay onRouteNodeClick"); } return false; } @Override public final boolean onMarkerClick(Marker marker) { for (Overlay mMarker : mOverlayList) { if (mMarker instanceof Marker && mMarker.equals(marker)) { if (marker.getExtraInfo() != null) { onRouteNodeClick(marker.getExtraInfo().getInt("index")); } } } return true; } @Override public boolean onPolylineClick(Polyline polyline) { // TODO Auto-generated method stub return false; } }