在谷歌地图api 2上移动标记

如何在Google maps api V2上移动标记? 我使用下面的代码,但它不会在地图上移动标记。 我在这做错了什么? 这应该在位置更改时起作用,所以我添加了onLocationChanged方法,并且在这里,我获取位置详细信息并尝试在新细节上移动标记,但这不起作用。

这是我的代码:

import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.gson.Gson; public class MapViewActivity extends Activity implements LocationListener, SensorEventListener, OnClickListener { GoogleMap googleMap; private boolean started = false; private ArrayList sensorData; private SensorManager sensorManager; private Button btnStart, btnStop; private String provider; // File root, dir, sensorFile; FileOutputStream fOut; private Sensor mAccelerometer; private FileWriter writer; private DatabaseHelper databaseHelper; private BroadcastReceiver alarmReceiver; private PendingIntent pendingIntentSender, pendingIntentReceiver; private AlarmManager alarmManager; private Intent alarmIntent,alarmIntent2; // private Button btnUpload; @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { databaseHelper = new DatabaseHelper(this); databaseHelper.removeAll(); Log.v("datacount", Integer.toString(databaseHelper.getLocDataCount())); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mAccelerometer = sensorManager .getDefaultSensor(Sensor.TYPE_ACCELEROMETER); btnStart = (Button) findViewById(R.id.btnStart); btnStop = (Button) findViewById(R.id.btnStop); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); btnStart.setEnabled(true); btnStop.setEnabled(false); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); int status = GooglePlayServicesUtil .isGooglePlayServicesAvailable(getBaseContext()); if (status != ConnectionResult.SUCCESS) { // Google Play Services // are // not available int requestCode = 10; Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); dialog.show(); } else { // Google Play Services are available // Getting reference to the SupportMapFragment of // activity_main.xml // SupportMapFragment supportMapFragment = (MapFragment) // getFragmentManager().findFragmentById(R.id.map); // Getting GoogleMap object from the fragment googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); // can use for overlay on the map List latList = new ArrayList(); latList.add(145.7309593); latList.add(146.34); latList.add(147.34); List lonList = new ArrayList(); lonList.add(-122.6365384); lonList.add(-123.6365384); lonList.add(-124.6365384); for (int i = 0; i < 3; i++) { // LatLng latLng = new LatLng(45.7309593, -122.6365384); LatLng latLng = new LatLng(latList.get(i).doubleValue(), lonList.get(i).doubleValue()); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap .addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); } // Enabling MyLocation Layer of Google Map googleMap.setMyLocationEnabled(true); LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, true); Location location = locationManager .getLastKnownLocation(provider); if (location != null) { onLocationChanged(location); } locationManager .requestLocationUpdates(provider, 20000, 0, this); } } catch (Exception e) { e.printStackTrace(); } } public void onSensorChanged(SensorEvent event) { if (started) { double x = event.values[0]; double y = event.values[1]; double z = event.values[2]; long timestamp = System.currentTimeMillis(); LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setPowerRequirement(Criteria.POWER_MEDIUM); criteria.setAccuracy(Criteria.ACCURACY_FINE); provider = locManager.getBestProvider(criteria, true); Location location = locManager.getLastKnownLocation(provider); double latitude = 0; double longitude = 0; if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } AccelLocData accelLocData = new AccelLocData(timestamp, x, y, z, latitude, longitude); // Log.d("X data","data x:" + data.getX()); try { // writer.write(data.toString()); if (databaseHelper != null) databaseHelper.insertLocData(accelLocData); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void onLocationChanged(Location location) { TextView tvLocation = (TextView) findViewById(R.id.tv_location); // Getting latitude of the current location double latitude = location.getLatitude(); // Getting longitude of the current location double longitude = location.getLongitude(); // Creating a LatLng object for the current location LatLng latLng = new LatLng(latitude, longitude); // Showing the current location in Google Map googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); // Zoom in the Google Map googleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnStart: Context context = getApplicationContext(); alarmIntent = new Intent(context, AccelLocSender.class); AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); pendingIntentSender = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, pendingIntentSender); alarmIntent2 = new Intent(context, AccelLocReceiver.class); pendingIntentReceiver = PendingIntent.getBroadcast(context, 0, alarmIntent2, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 30000, pendingIntentReceiver); btnStart.setEnabled(false); btnStop.setEnabled(true); Log.d("startbutton", "cam on click of start"); started = true; // delete all files.. // start thread to send data sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_FASTEST); break; case R.id.btnStop: try { btnStart.setEnabled(true); btnStop.setEnabled(false); // btnUpload.setEnabled(true); started = false; sensorManager.unregisterListener(this); Context context1 = getApplicationContext(); AlarmManager alarmManager1 = (AlarmManager) context1 .getSystemService(Context.ALARM_SERVICE); alarmManager1.cancel(pendingIntentSender); alarmManager1.cancel(pendingIntentReceiver); // System.exit(0); } catch (Exception e) { e.printStackTrace(); } break; default: break; } } protected void onPause() { super.onPause(); /* * if (writer != null) { try { writer.close(); } catch (IOException e) { * // TODO Auto-generated catch block e.printStackTrace(); } } */ } protected void onResume() { super.onResume(); /* * try { Log.d("onresume","called onresume"); writer = new * FileWriter(sensorFile, true); } catch (IOException e) { // TODO * Auto-generated catch block e.printStackTrace(); } */ } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { // TODO Auto-generated method stub } } 

  • 多选在移动设备上选择框
  • Ionic Cordova FileUpload错误:不允许加载本地资源
  • 如何在我的手机上拨打来电,触发我的电脑上的操作
  • 有没有办法在使用JavaScript(特别是Chrome)的网络浏览器中阅读耳机按钮事件?
  • MoSync体验
  • 亚行未能识别我的设备
  • Whatsapp身份validation如何运作?
  • 离开活动时Android如何处理后台线程?
  • variables

      Marker now; 

    在这部分中添加标记并删除标记,当然要放入其余的标记属性:

      @Override public void onLocationChanged(Location location) { if(now != null){ now.remove(); } TextView tvLocation = (TextView) findViewById(R.id.tv_location); // Getting latitude of the current location double latitude = location.getLatitude(); // Getting longitude of the current location double longitude = location.getLongitude(); // Creating a LatLng object for the current location LatLng latLng = new LatLng(latitude, longitude); now = googleMap.addMarker(new MarkerOptions().position(latLng))); // Showing the current location in Google Map googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); // Zoom in the Google Map googleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); } 

    优化移动标记的方式:

    标记mMarker;

    将标记添加到地图后。 同时更改您需要设置位置的位置,而不是删除标记并再次添加。

    mMarker.setPosition(new LatLon(latLng));

    这将减少删除代码并将标记添加到直接设置位置,并降低复杂性。 🙂

    请享用。

    您只是在位置更改时移动相机,您应该添加标记,然后它将在当前位置绘制标记。 并在添加标记之前通过调用googlmap.clear()清除所有以前的标记;

    使用标记拖动标记,

      MarkerOptions markerOptions = new MarkerOptions().position(myLaLn).title( "Current Location").draggable(true); map.addMarker(markerOptions); 

    获取拖动的位置和详细信息如下,

     map.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { @Override public void onMarkerDragStart(Marker marker) { } @Override public void onMarkerDragEnd(Marker marker) { Log.d(TAG, "latitude : "+ marker.getPosition().latitude); marker.setSnippet(marker.getPosition().latitude); map.animateCamera(CameraUpdateFactory.newLatLng(marker.getPosition())); } @Override public void onMarkerDrag(Marker marker) { } }); 

    addMarker返回对标记的引用,稍后可以更新该标记

     mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { if(mMarker == null) { mMarker = mMap.addMarker(new MarkerOptions().position(latLng)); } else { mMarker.setPosition(latLng); } } });