3

对于新的 Maps API,我注意到当您按下地图上的“我的位置”图钉时,既onMapClick()不会触发也不会触发。onMarkerClick()

这向我表明,应该在某个地方有一个侦听器来侦听这些事件,在这些事件中按下了“我的位置”触摸事件,但我找不到任何东西。有人对此有解决方案吗?

我一直在考虑这样的解决方法:

禁用标准MyLocation图标并创建一个功能类似于我的位置图钉的普通标记。

myLocationPin = mMap.addMarker(new MarkerOptions()
                          .title("My Location")
                          .icon(BitmapDescriptorFactory.fromResource(R.drawable.mylocation)));

并实施LocationSource.OnLocationChangedListener

public void onLocationChanged (Location location) {
    myLocationPin.position(new LatLng(location.latitude, location.longitude)); 
}

但是我对这种方法有两个问题:

  1. 我不知道如何关闭标记
  2. 我不知道onLocationListener如果我替换默认的LocationSource. 在上面找不到任何文档或源代码。
4

2 回答 2

1

由于发布了此问题,OnMyLocationChangeListener因此已将其添加到 API 中,从而使解决方法的实施(很多)更容易(即不再需要自定义LocationSource)。

因此,您可以在“我的位置”点顶部绘制一个Marker(带有类似图标)以接收相应的onMarkerClick()回调。

public class DemoMapFragment extends SupportMapFragment implements OnMyLocationChangeListener, OnMarkerClickListener { 

    // Note that 'mMap' may be null if the Google Play services APK is not available. 
    private GoogleMap mMap; 
    private Marker myLocationMarker;
    private static BitmapDescriptor markerIconBitmapDescriptor;
    /* ... */

    @Override 
    public void onResume() { 
        super.onResume(); 
        setUpMapIfNeeded(); // Get a reference to the map      
        mMap.setMyLocationEnabled(true); // Enable the my-location layer 
        mMap.setOnMyLocationChangeListener(this); 
        mMap.setOnMarkerClickListener(this);
    }

    private void setUpMapIfNeeded() { 
        // Do a null check to confirm that we have not already instantiated the map. 
        if (mMap == null) { 
            mMap = getMap(); 
            // Check if we were successful in obtaining the map. 
            if (mMap != null) { 
                // The Map is verified. It is now safe to manipulate the map:

                // Load custom marker icon
                markerIconBitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.my_location_dot_icon); 

                // When the map is first loaded we need to add our marker on top of My Location dot
                myLocationMarker = mMap.addMarker(new MarkerOptions() 
                        .position(new LatLng(mMap.getMyLocation().getLatitude(),mMap.getMyLocation().getLongitude())) 
                        .icon(markerIconBitmapDescriptor)); 

                // Set default zoom 
                mMap.moveCamera(CameraUpdateFactory.zoomTo(15f)); 
            } 
        } 
    }   

    @Override
    public void onMyLocationChange(Location location) {
        // Remove the old marker object
        myLocationMarker.remove(); 

        // Add a new marker object at the new (My Location dot) location
        myLocationMarker = mMap.addMarker(new MarkerOptions() 
                .position(new LatLng(location().getLatitude(),location().getLongitude())) 
                .icon(markerIconBitmapDescriptor)); 
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        if (marker.equals(myLocationMarker)) {
            /* My Location dot callback ... */
        }
    }
}
于 2013-04-21T00:14:27.983 回答
0

“打破任何东西”是什么意思?你能详细说明一下吗?

另一种选择是,您也可以尝试从系统位置服务中收听位置变化。在您的活动中请求位置服务:

locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
locatoinManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,2f,this);

您的活动扩展 LocationListener

public void onLocationChange(Location location){
     yourLocationPin.position(new LatLng(location.latitude, location.longitude)); 
}
于 2013-01-17T18:18:14.763 回答