现在的位置: 首页 > 综合 > 正文

andriod map开发5 绘制当前位置

2014年02月18日 ⁄ 综合 ⁄ 共 4726字 ⁄ 字号 评论关闭

在地图上添加图层的时候,用了ItemizedOverlay,绘制自己位置的时候,也用的这个类,发现很麻烦。google地图上显示当前位置,会有一个蓝色的指南针并且还有范围指示,查了API后发现google提供了结构,MyLocationOverlay,可以很轻松定位到当位置,只不过木有蓝色的指南针,变成一个圆点了。

类结构
com.google.android.maps 

Class Overlay 
java.lang.Object
  com.google.android.maps.Overlay

Direct Known Subclasses:
ItemizedOverlay, MyLocationOverlay  

要实现绘制自己位置,首先要重写MyLocationOverlay ,根据需要重新对应的方法。实例中重写了onLocationChanged,实现自动定位到当前位置,并把地图居中
package demo.map;

import android.content.Context; 
import android.graphics.Point;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
/**
 *我的位置 
 * 
 * 
 */
public class MyLocOverlay extends MyLocationOverlay
{
MapView mapView = null;

public MyLocOverlay(Context context, MapView mapView)
{
super(context, mapView);
this.mapView = mapView;
}

@Override
public synchronized void disableCompass()
{
super.disableCompass();
}

@Override
public synchronized void disableMyLocation()
{
super.disableMyLocation();
}

@Override
protected boolean dispatchTap()
{

Log.v("dispatchTap", "点击了当前位置");
return super.dispatchTap();

@Override
public synchronized boolean enableCompass()
{
return super.enableCompass();
}

@Override
public synchronized boolean enableMyLocation()
{
return super.enableMyLocation();
}

@Override
public Location getLastFix()
{
return super.getLastFix();
}

@Override
public GeoPoint getMyLocation()
{
return super.getMyLocation();
}

@Override
public float getOrientation()
{
return super.getOrientation();
}

@Override
public boolean isCompassEnabled()
{
return super.isCompassEnabled();
}

@Override
public boolean isMyLocationEnabled()
{
return super.isMyLocationEnabled();

@Override
public synchronized void onLocationChanged(Location location)

super.onLocationChanged(location);
double lat = location.getLatitude();
double lon = location.getLongitude();
Log.v("onLocationChanged", "location: "
         +"纬度:"+lat
         +"经度:"+lon
); 

GeoPoint point = new GeoPoint((int)(lat*1E6), (int)(lon*1E6));
 
mapView.getController().animateTo(point);

}

@Override
public void onProviderDisabled(String provider)

super.onProviderDisabled(provider);
Log.v("onProviderDisabled", "provider: "+provider);
}

@Override
public void onProviderEnabled(String provider)

super.onProviderEnabled(provider);

Log.v("onProviderEnabled", "provider: "+provider);
}

 
@Override
public boolean onSnapToItem(int x, int y, Point snapPoint, MapView mapView)
{
 
return super.onSnapToItem(x, y, snapPoint, mapView);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras)

super.onStatusChanged(provider, status, extras);
}

@Override
public boolean onTap(GeoPoint p, MapView map)
{
 
return super.onTap(p, map);
}

@Override
public synchronized boolean runOnFirstFix(Runnable runnable)
{
 
return super.runOnFirstFix(runnable);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event, MapView mapView)
{
 
return super.onKeyDown(keyCode, event, mapView);
}

@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView)

return super.onTouchEvent(e, mapView);



}  

}

测试类
 package demo.map;
 
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ZoomControls;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class TestMapActivity extends MapActivity implements OnClickListener
{

MapView mv = null;  
 
MapController mapController = null;
MapView.LayoutParams screenLP;
ZoomControls zoomControls = null;
        ImageButton imgButton = null; 
        MyLocOverlay mlo = null;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main); 
 
mv = (MapView) findViewById(R.id.mapView); 
mapController = mv.getController(); 
   
mv.setBuiltInZoomControls(true);
mv.setStreetView(true);
mapController.setZoom(21); 

      
       //在地图上添加一个定位的按钮
screenLP = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, 450, 20,
MapView.LayoutParams.RIGHT); 
 
imgButton = new ImageButton(getApplicationContext());
imgButton.setImageResource(R.drawable.dingwei);
imgButton.setOnClickListener(this);
mv.addView(imgButton, screenLP);
 
init();
}

private void init()
{
mlo = new MyLocOverlay(this, mv);

/*

* enableMyLocation() 尝试开启MyLocation功能,并向LocationManager.GPS_PROVIDER
* LocationManager.NETWORK_PROVIDER注册更新。
*/

mlo.enableCompass();// 开启指南针更新功能。  
// 将我的我的位置添加到图层

 


 
@Override
protected boolean isRouteDisplayed()
{
return false;
}

@Override
public void onClick(View v)
{
Log.e("", "onClick");

if (!mlo.isMyLocationEnabled())
{
mlo.enableMyLocation();
mlo.enableCompass();
mv.getOverlays().add(mlo);

}


@Override
protected void onPause()

super.onPause();
 
mlo.disableCompass();
mlo.disableMyLocation();
}

@Override
protected void onResume()
{
super.onResume();  
}
 

}

效果图

【上篇】
【下篇】

抱歉!评论已关闭.