java - 如何使用 Android map 创建具有自定义分辨率的纬度范围

标签 java android

我正在使用 LatLngBounds.Builder 类来创建基于两个位置的缩放级别,效果很好,但我需要创建一个与一半屏幕的边界,因为我正在使用带有布局的底页。

这是绘制折线并设置这两个位置之间的边界的方法:

Update!

我先打开底部!

private void openBottom(){
    if(latLngs != null){
        if(bottomSheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED){
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        }
        drawnNewRoute();
    }
}

然后,绘制边界:

private void drawnNewRoute() {
    if(polyline == null){

            po = new PolylineOptions();
            for(int i = 0, tam = latLngs.size(); i < tam; i++){
                po.add(latLngs.get(i));
            }
            String data = new Gson().toJson(latLngs);

            po.color(Color.BLACK).width(10);
            polyline = mMap.addPolyline(po);

            ArrayList<LatLng> latlang = new ArrayList<>();
            latlang.add(latLngs.get(0));
            latlang.add(latLngs.get(latLngs.size() -1));

            mMarkerNewPosition = mMap.addMarker(new MarkerOptions().position(finalLocaltion).title(finalLocationName));
            mMarkerNewPosition.showInfoWindow();

            location_display_incl.setVisibility(View.GONE);

            stopLocation();
            InitialAddressTxt.setText(InitialAddress);
            double finalLat = latLngs.get(latLngs.size() -1).latitude;
            double finalLong = latLngs.get(latLngs.size() -1).longitude;

            try {
                ADRS = getAddress(finalLat,finalLong);
            } catch (IOException e) {
                e.printStackTrace();
            }

            FinalAddressTxt.setText(finalLocationName);
            String finalComp = ADRS.getLocality() + "," + address.getAdminArea();
            FinalComplement.setText(finalComp);
            zoomToCoverAllMarkersInMap(latlang);
    }
    else{
        polyline.setPoints(latLngs);
    }
}

这就是结果:

enter image description here

这就是我需要的

:enter image description here

底表 XML:

<android.support.v4.widget.NestedScrollView
    app:layout_behavior="@string/bottom_sheet_behavior"
    android:id="@+id/bottomSheet"
    android:background="@android:color/white"
    android:layout_width="match_parent"
    android:layout_height="300dp">

最佳答案

这是您问题的解决方案。

声明 LatLng 的数组列表。

ArrayList<LatLng> latlang;

现在初始化数组列表。

latlang = new ArrayList<LatLng>();

现在,将 fromPostion 和 toPosition 添加到 arraylist 中。在全局添加 Declare fromPosition 和 toPosition 对象之前,我们可以随时使用它。

LatLng fromPosition;
LatLng toPosition;

现在初始化这两个对象并添加 fromLocationLatitude、fromLocationLongitude 和 toLocationLatitude、toLocationLongitude。

fromPosition = new LatLng(fromLocationLatitude, fromLocationLongitude);
toPosition = new LatLng(toLocationLatitude, toLocationLongitude);

latlang.add(fromPosition);
latlang.add(toPosition);

将两个点添加到数组列表中后,只需将数组列表传递给 ZoomToCoverAllMarkersInMap() 这个函数即可完成。

private void zoomToCoverAllMarkersInMap(ArrayList<LatLng> latLngList)
{
    LatLngBounds.Builder builder = new LatLngBounds.Builder();

    for (LatLng marker : latLngList)
    {
        builder.include(marker);
    }

    LatLngBounds bounds = builder.build();
    int padding = 60;
    final CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);

    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition arg0) {
            googleMap.moveCamera(cu);
            googleMap.animateCamera(cu);
            googleMap.setOnCameraChangeListener(null);
        }
    });
}

注意:setOnCameraChangeListener 已弃用,但它仍然可以在 7.0 上运行,因此没有问题。

关于java - 如何使用 Android map 创建具有自定义分辨率的纬度范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44603853/

相关文章:

java - 如何检查选项卡是否已在 JavaFX 的 TabPane 中打开

android - SMSManager 已弃用

android - 将特定修订版 Github 项目的插件添加到 Cordova 项目

Android Chromecast 搜索行为 - 从头开始​​重新启动视频

java - 使用 Netbeans 和 JSF 搭建 ManyToMany 关联

java - 为什么Thread.isInterrupted()总是返回false?

java - 向右移动项目时将元素插入数组

java - 如何保持套接字输出流打开并多次写入

android - 停止并取消绑定(bind) Android 中不同 Activity 的服务

android - 以编程方式更改应用程序主题(不在主要 Activity 中)