【问题标题】:How to Focus at Marker in google map in android如何在android中的谷歌地图中聚焦标记
【发布时间】:2013-08-01 01:21:08
【问题描述】:

我只是想知道我们是否可以专注于在 android 应用程序中添加的标记。如果是,如何?或者有没有其他方法可以完成这项任务。

假设我使用以下代码添加了一个标记:

map.addMarker(new MarkerOptions()
            .title(title)
            .snippet(snippet)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
            .position(pos)
                );

如何以最大缩放聚焦此标记。如果我要再添加 1 个标记,它应该调整缩放(最大可能缩放),以便两个标记同时显示。
这就是我想要做的,但它在map.moveCamera(cu); 行失败了。

import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.CancelableCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class LocateUserInMap extends FragmentActivity {
    private GoogleMap map;
    private List<Marker> markers;

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

        markers = new ArrayList<Marker>();
        Intent intent = getIntent();
        double frndLatVal = intent.getDoubleExtra("frndLatVal", 0);
        double frndLonVal = intent.getDoubleExtra("frndLonVal", 0);
        LatLng myloc = new LatLng(19.115486500000000000, 72.905544299999970000);
        LatLng friendloc = new LatLng(frndLatVal, frndLonVal);
        map = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.google_map)).getMap();
        addToMap(myloc, "My location", "From here 0M", "blue");
        addToMap(friendloc, "Friend location", "From here 100M", "red");
        showMarkersAtOnce();
    }

    private void showMarkersAtOnce() {
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (Marker m : markers) {
            builder.include(m.getPosition());
        }
        LatLngBounds bounds = builder.build();
        int padding = 0; // offset from edges of the map in pixels
        CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
        map.moveCamera(cu);
    /*  map.getUiSettings().setScrollGesturesEnabled(false);
        map.animateCamera(cu,
                //CameraUpdateFactory.newLatLng(new LatLng(lat, lng))
                 new CancelableCallback()
        {

            @Override
            public void onFinish()
            {
                map.getUiSettings().setScrollGesturesEnabled(true);

            }

            @Override
            public void onCancel()
            {
                map.getUiSettings().setAllGesturesEnabled(true);

            }
        });*/
      //  map.animateCamera(CameraUpdateFactory.zoomBy(13));
    }

    private void addToMap(LatLng pos, String title, String snippet,
            String markercolor) {
        Marker localmarker = null;
        if (markercolor == "blue")
        {
            localmarker = map.addMarker(new MarkerOptions()
                    .title(title)
                    .snippet(snippet)
                    .icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
                    .position(pos));
        } else if (markercolor == "red") 
        {
            localmarker = map.addMarker(new MarkerOptions()
                    .title(title)
                    .snippet(snippet)
                    .icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_RED))
                    .position(pos));
        }

        markers.add(localmarker);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.locate_user_in_map, menu);
        return true;
    }

}

和Logcat

08-04 13:23:32.975: W/EGL_emulation(764): eglSurfaceAttrib not implemented
08-04 13:23:42.787: D/dalvikvm(764): GC_CONCURRENT freed 169K, 3% free 11335K/11591K, paused 130ms+40ms, total 336ms
08-04 13:23:49.812: D/dalvikvm(764): GC_CONCURRENT freed 273K, 3% free 11497K/11847K, paused 121ms+124ms, total 480ms
08-04 13:23:49.972: E/ActivityThread(764): Failed to find provider info for com.google.settings
08-04 13:23:50.259: E/ActivityThread(764): Failed to find provider info for com.google.settings
08-04 13:23:54.223: D/dalvikvm(764): GC_CONCURRENT freed 262K, 3% free 11686K/12039K, paused 115ms+110ms, total 396ms

【问题讨论】:

    标签: android google-maps-markers google-maps-api-2


    【解决方案1】:

    您必须计算所有标记。这样做

    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for each (Marker m : markers) {
        builder.include(m.getPosition());
    }
    LatLngBounds bounds = builder.build();
    

    现在获取CameraUpdateFactory:

    int padding = 0; // offset from edges of the map in pixels
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    

    最后像这样在一组标记上移动相机:

    googleMap.moveCamera(cu);
    

    或者如果你想要一个动画:

    googleMap.animateCamera(cu);
    

    【讨论】:

    • 我需要准备标记(标记数组)还是有任何内置方法可以从地图中获取所有添加的标记?
    • 你能提供任何我可以关注的参考链接吗?
    • 我认为没有任何方法可以获取地图上的所有标记。您必须手动将所有经纬度标记放入 Bound 中。或者,您可以在将它们添加到 Map 时将它们添加到数组中。在这里您可以找到有关 LatLongBounds developers.google.com/maps/documentation/android/reference/com/… 的一些详细信息
    • 我已经解决了。我需要等待地图加载才能animateCamera 工作,但这里还有一个问题,我该如何等待然后调用方法来更新相机。我不希望用户单击以在单个视图中获取两个标记。
    【解决方案2】:

    你可以做这样的事情。您要做的是遍历您的标记并找到最外面的坐标。

    LatLngBounds bounds = new LatLngBounds(southWest, northEast);
    
    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, MAP_PADDING));
    

    【讨论】:

    • 张贴在 OP。请看一下。 moveCamera/animateCamera 正在工作,如果我使用 map.animateCamera(CameraUpdateFactory.zoomBy(13));
    • 请您也发布堆栈跟踪
    • 你是在模拟器还是手机上运行这个?
    • 在模拟器上。但是我已经使用 (blog-emildesign.rhcloud.com/?p=527) [this] 教程设置了我的模拟器,我可以在模拟器上看到地图。我正在使用“google_play_service_libs”v4。
    • 尝试在手机上运行它
    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 2012-12-17
    • 2013-01-08
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多