如何在android中改变位置时将标记放在地图上

时间:2011-04-19 18:37:29

标签: android google-maps android-emulator

package com.android.gps;

import java.util.List;

import com.android.gps.hellogps.MyLocation.MapOverlay;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MapView.LayoutParams;
import com.google.android.maps.Overlay;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

public class hellogps extends MapActivity {
    /** Called when the activity is first created. */
    MapView mapView; 
    MapController mc;
    GeoPoint p;
    LocationManager locationManager;
    hellogps x;
    MapOverlay mapOverlay;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.linear);  
        View zoomView = mapView.getZoomControls(); 

        zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, 
                LayoutParams.WRAP_CONTENT)); 
        mapView.displayZoomControls(true);

        mc = mapView.getController();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        LocationListener mlocListener = new MyLocation(); 


        locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 10f, mlocListener);





    }



    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
public class MyLocation implements LocationListener
{

    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub

        int lat = (int) (location.getLatitude() * 1E6);
        int lng = (int) (location.getLongitude() * 1E6);



        GeoPoint p = new GeoPoint(lat, lng);

         mc.setZoom(17);
            mc.animateTo(p);
          List<Overlay> listOfOverlays = mapView.getOverlays();
            listOfOverlays.clear();
            listOfOverlays.add(mapOverlay);        

            mapView.invalidate();


         mapView.invalidate();

    }
       class MapOverlay extends com.google.android.maps.Overlay
        {
           MapOverlay mapOverlay=new MapOverlay();

            @Override
            public boolean draw(Canvas canvas, MapView mapView, 
            boolean shadow, long when) 
            {
                super.draw(canvas, mapView, shadow);                   

                //---translate the GeoPoint to screen pixels---
                Point screenPts = new Point();
                mapView.getProjection().toPixels(p, screenPts);

                //---add the marker---
                Bitmap bmp = BitmapFactory.decodeResource(
                    getResources(), R.drawable.push_pin);            
                canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
                return true;
            }
        } 

    @Override
    public void onProviderDisabled(String provider) {
        // 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

    }}}

我在android做我的大学项目的新手 当我运行我的应用程序它工作正常,但当我通过telnet发送位置坐标时,它出现一个蓝色屏幕,没有标记 请帮助我

2 个答案:

答案 0 :(得分:2)

MyLocation方法onLocationChanged课程中,您应该代替GeoPoint p = new GeoPoint(lat, lon);尝试p = new GeoPoint(lat, lon);而不是p。在您的代码中,您创建了一个名为p的新变量(与全局变量相同),并且您的局部变量指向了对象。您的本地变量= null并未指向任何内容(p)。因为您在绘图中使用全局变量{{1}}并且设置为null。

答案 1 :(得分:1)

如果您只是想在地图上显示用户的当前位置,那么使用内置的MyLocationOverlay类可能会更容易。

在onCreate()中使用以下内容:

        MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mapView);
        mapView.getOverlays().add(myLocationOverlay);
        myLocationOverlay.enableCompass(); // if you want to display a compass also
        myLocationOverlay.enableMyLocation();

这将显示用户当前位置并在他们四处移动时进行更新。它不会保留用户所在位置的轨迹。 (我不确定这是你想要完成的,还是只显示当前位置。)