Android 如何在我的谷歌地图上正确拟合并居中多段线?

Android 如何在我的谷歌地图上正确拟合并居中多段线?,android,camera,google-maps-android-api-2,google-polyline,Android,Camera,Google Maps Android Api 2,Google Polyline,我正在使用谷歌地图V2为我的应用程序,我需要适合和中心的多段线在我的地图上。首先,我使用mGoogleMap.setPadding(0,0,0,bottomPadding)更改地图的底部填充。之后,我将在地图上绘制多段线。最后,我将使用包含所有多段线点的latlngbounds聚焦所有多段线,并为地图的摄影机设置动画。但不幸的是,多段线没有正确显示,因为大部分时间多段线都在相机外 @Override protected void onCreate(Bundle savedInstanc

我正在使用谷歌地图V2为我的应用程序,我需要适合和中心的多段线在我的地图上。首先,我使用
mGoogleMap.setPadding(0,0,0,bottomPadding)
更改地图的底部填充。之后,我将在地图上绘制多段线。最后,我将使用包含所有多段线点的latlngbounds聚焦所有多段线,并为地图的摄影机设置动画。但不幸的是,多段线没有正确显示,因为大部分时间多段线都在相机外

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setMapPadding(0,0,0,100);
        getDirections ("","","","",""); // http query to google directions api, 
          //assume that the parameters here are valid

    }


private void getDirections (String key, String origin, String destination, String unit){
        mService.getDirections(key, origin, destination, unit, new Callback<Directions>() {
            @Override
            public void success(final Directions directions, Response response) {
                if (directions.getStatus().equals("OK")) {
                    String distance = directions.getRoutes().get(0).getLegs().get(0)
                            .getDistance().getText();

                    LatLngBounds latLngBounds = createDirectionBounds(directions.getRoutes()
                            .get(0).getOverviewPolyline());
                    mMapFragment.plotTravelDirections(directions.getRoutes().get(0)
                            .getOverviewPolyline().getPoints());
                    mMapFragment.showTravelDirections(latLngBounds);

                }
            }
            @Override
            public void failure(RetrofitError error) {}
        });
    }

    private LatLngBounds createDirectionBounds(OverviewPolyline overviewPolyline){
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        List<LatLng> decodedPolyline = PolyUtil.decode(overviewPolyline.getPoints());
        for(int ctr=0; ctr <decodedPolyline.size()-1; ctr++){
            builder.include(decodedPolyline.get(ctr));
        }
        return builder.build();
    }
打印多段线:

public void plotTravelDirections (String overviewPolyLine){
        mGoogleMap.clear();
        List<LatLng> decodedPolyLine = PolyUtil.decode(overviewPolyLine);
        mGoogleMap.addPolyline(new PolylineOptions().addAll(decodedPolyLine)
                .color(ContextCompat.getColor(getActivity(), R.color.hitch_red)).geodesic(true));
        BitmapDescriptor pickUpMarker = BitmapDescriptorFactory.fromResource(R.drawable.ic_marker);
        BitmapDescriptor destinationMarker = BitmapDescriptorFactory.fromResource(R.drawable.ic_end_marker);
        mGoogleMap.addMarker(new MarkerOptions().position(decodedPolyLine.get(0)).icon(pickUpMarker));
        mGoogleMap.addMarker(new MarkerOptions().position(decodedPolyLine
                .get(decodedPolyLine.size() - 1)).icon(destinationMarker));
    }

为什么从latLngBounds中排除decodedPolyline的最后一点?请参见方法createDirectionBounds中的for循环。新的“forEach”避免了这样的错误:因为(LatLng point:decodedPolyline){…}仍然得到相同的结果,我认为不正确显示多段线的原因是在打印和显示多段线之前添加的填充。因为我试着不设置填充,而且令人惊讶的是,多边形线正确地安装在地图的相机上。为什么从latLngBounds中排除decodedPolyline的最后一点?请参见方法createDirectionBounds中的for循环。新的“forEach”避免了这样的错误:因为(LatLng point:decodedPolyline){…}仍然得到相同的结果,我认为不正确显示多段线的原因是在打印和显示多段线之前添加的填充。因为我试着不设置填充物,而且令人惊讶的是,这些线正确地安装在地图的相机上
public void plotTravelDirections (String overviewPolyLine){
        mGoogleMap.clear();
        List<LatLng> decodedPolyLine = PolyUtil.decode(overviewPolyLine);
        mGoogleMap.addPolyline(new PolylineOptions().addAll(decodedPolyLine)
                .color(ContextCompat.getColor(getActivity(), R.color.hitch_red)).geodesic(true));
        BitmapDescriptor pickUpMarker = BitmapDescriptorFactory.fromResource(R.drawable.ic_marker);
        BitmapDescriptor destinationMarker = BitmapDescriptorFactory.fromResource(R.drawable.ic_end_marker);
        mGoogleMap.addMarker(new MarkerOptions().position(decodedPolyLine.get(0)).icon(pickUpMarker));
        mGoogleMap.addMarker(new MarkerOptions().position(decodedPolyLine
                .get(decodedPolyLine.size() - 1)).icon(destinationMarker));
    }
public void showTravelDirections (LatLngBounds latLngBounds){
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(latLngBounds, 0);
        mGoogleMap.animateCamera(cameraUpdate);
    }