0

我尝试制作基于 Android Maps API v2 的位置应用程序。我为我的位置点添加了标记,并为位置准确性添加了一个 GroundOverlay 圆圈。但 GroundOverlay 的 setPosition 函数设置略有不同。我找不到原因。

        package com.example.locator;

    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.BitmapDescriptorFactory;
    import com.google.android.gms.maps.model.GroundOverlay;
    import com.google.android.gms.maps.model.GroundOverlayOptions;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    import com.google.android.gms.maps.model.MarkerOptions;

    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.content.Context;
    import android.support.v4.app.FragmentActivity;
    import android.view.Menu;

    public class MainActivity extends FragmentActivity implements LocationListener
     {
        GoogleMap mMap;
        Location                lastLocation = null;
        private LocationManager locationManager;
        private String provider;
        Marker curLoc = null; 
        GroundOverlay curLocCircle = null; 

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

            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(22.375675950685434, 29.83346939086914), 13));

            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            provider = locationManager.getBestProvider(criteria, false);
            Location location = locationManager.getLastKnownLocation(provider);

            if (location != null) {
                onLocationChanged(location);
            } else {
                //empty
            }
            locationManager.requestLocationUpdates(provider, 400, 1, this);
        } 

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


        public void onLocationChanged(Location location) {
            if (location != null) {

                if (null != curLoc) {
                    curLoc.remove();
                }
                if (null != curLocCircle) {
                    curLocCircle.remove();
                }

                LatLng loc = new LatLng(location.getLatitude(),location.getLongitude());
                curLoc = mMap.addMarker(new MarkerOptions()
                .position(loc)
                .title("My location")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.location32)));

                float accuracy = location.getAccuracy();

                curLocCircle = mMap.addGroundOverlay(new GroundOverlayOptions()
                        .image(BitmapDescriptorFactory
                                .fromResource(R.drawable.location_circle))
                        .position(loc, accuracy)
                        .transparency(0)
                );
                curLocCircle.setPosition(loc);
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 13));
            }
        }

        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

    }

当我在线在调试器中暂停应用程序时

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 13));

手表显示此数据:

curLocCircle.getPosition()  lat/lng: (22.397815012772206,29.954818561673164)
location.getLatitude()      22.397815
location.getLongitude()     29.9548184
loc                         lat/lng: (22.397815,29.9548184)

curLocCircle.getPosition() 在 setPosition(loc) 之后以某种方式显示不正确的位置写入;请帮帮我。

4

1 回答 1

1

问题出在标记锚上。变成:

curLoc = mMap.addMarker(new MarkerOptions()
.position(loc)
.anchor(0.5f, 0.5f)
.title("My location")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.location32)));

一切都很好。我仍然不明白为什么 GroundOverlay 的位置与定义的位置不同,但我不在乎。这看起来不错的样子。

于 2013-01-19T12:47:18.057 回答