我正在尝试使用自定义Overlay类为OSMdroid地图制作自定义标记。我想我得到了它,但它在draw contructor上给了我一个StackOverflowError
这是主要活动的代码
package com.example.osmap1;import java.util.List;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Overlay;
import com.example.osmap1.herramientas.MiOverlay;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
MapView map;
MapController mc;
GeoPoint gp;
List<Overlay> mOverlays;
private static MainActivity mainActivity=null;
public static MainActivity getInstance(){
if(mainActivity == null){
mainActivity=new MainActivity();
}
return mainActivity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainActivity=this;
map=(MapView)findViewById(R.id.mapView);
mc=map.getController();
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
addPointToMapOverlay("43.528023","-5.672949");
}
private void addPointToMap (String latitud, String longitud){
String coordenadas[]={latitud,longitud};
double lat=Double.parseDouble(coordenadas[0]);
double lng=Double.parseDouble(coordenadas[1]);
GeoPoint gp=new GeoPoint((int)lat*1E6,(int)lng*1E6);
mc.animateTo(gp);
mc.setZoom(4);
/*map.invalidate(); no funciona en osm*/
}
private void addPointToMapOverlay (String latitud, String longitud){
String coordenadas[]={latitud,longitud};
double lat=Double.parseDouble(coordenadas[0]);
double lng=Double.parseDouble(coordenadas[1]);
GeoPoint gp=new GeoPoint((int)lat*1E6,(int)lng*1E6);
mOverlays=map.getOverlays();
MiOverlay marker= new MiOverlay(gp);
mOverlays.add(marker);
mc.animateTo(gp);
mc.setZoom(4);
map.invalidate();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
这是我的自定义类代码
public class MiOverlay extends Overlay{
private GeoPoint punto;
public MiOverlay(GeoPoint point) {
super(MainActivity.getInstance().getBaseContext());
this.punto=point;
// TODO Auto-generated constructor stub
}
@Override
public void draw(Canvas canvas, MapView mapview, boolean shadow) {
// TODO Auto-generated method stub
this.draw(canvas, mapview, shadow);
//se traduce el punto geo localizado a un punto en la pantalla
Point scrnPoint = new Point();
mapview.getProjection().toPixels(this.punto, scrnPoint);
//se construye un bitmap a partir de la imagen
Bitmap marker = BitmapFactory.decodeResource(MainActivity.getInstance().getResources(),com.example.osmap1.R.drawable.seas);
//se dibuja la imagen del marker
canvas.drawBitmap(marker, scrnPoint.x - marker.getWidth() / 2, scrnPoint.y - marker.getHeight() / 2, null);
}
public boolean onTouchEvent(MotionEvent event, MapView mapView)
{
//---when user lifts his finger---
if (event.getAction() == 1) {
GeoPoint p = (GeoPoint) mapView.getProjection().fromPixels(
(int) event.getX(),
(int) event.getY());
Toast.makeText(MainActivity.getInstance().getBaseContext(),
p.getLatitudeE6() / 1E6 + "," +
p.getLongitudeE6() /1E6 ,
Toast.LENGTH_SHORT).show();
}
return false;
}
}
我认为问题可能是mapview.getProjection()。toMapPixels(this.punto,scrnPoint)但我不确定......任何消化都是好的
答案 0 :(得分:0)
这是一个无限循环 - 我承认我不太明白你想要做什么,但是draw函数会递归地调用它自己:
@Override
public void draw(Canvas canvas, MapView mapview, boolean shadow) {
this.draw(canvas, mapview, shadow); // This is the same method!
}
说明控制流程的结果如下:
draw()
-> draw()
-> draw()
...
StackOverflowException
也许你的意思是super.draw(canvas, mapview, shadow)
?