到目前为止,我总是在 MapActivity 中使用 OverlayItems 和我制作的类 Point 绘制“点”。使用这种方法,我可以在 MapActivity 中绘制一些“点”。但是我如何绘制“可点击”点?
我即兴创作了这个类 Point,并遵循有关 OverlayItems 方法的教程,但我可以实现任何你自己为这个“可点击点”解释我的方法。
谢谢。
到目前为止,我总是在 MapActivity 中使用 OverlayItems 和我制作的类 Point 绘制“点”。使用这种方法,我可以在 MapActivity 中绘制一些“点”。但是我如何绘制“可点击”点?
我即兴创作了这个类 Point,并遵循有关 OverlayItems 方法的教程,但我可以实现任何你自己为这个“可点击点”解释我的方法。
谢谢。
以这个项目为例,看看如何实现可点击的 OverlayItems https://github.com/jgilfelt/android-mapviewballoons
我找不到这样做的方法,所以我编写了自己的点击逻辑。这是来自我现在搁置的一个项目,并且正在进行中(例如硬编码值),但逻辑有效。希望能帮助到你:
@Override
public boolean onTap(GeoPoint geoPoint, MapView mapView){
if (!isRoute){ // nothing to do if it's a route
Cursor cursor = (Cursor) mapView.getTag();
Projection projection = mapView.getProjection();
// get pixels for the point clicked
Point clickedPoint = new Point();
projection.toPixels(geoPoint, clickedPoint);
if (cursor.moveToFirst()){
do {
try {
Double lat = cursor.getFloat(Database.LAT_COLUMN) * 1E6;
Double lng = cursor.getFloat(Database.LONG_COLUMN) * 1E6;
GeoPoint thisGeoPoint = new GeoPoint(lat.intValue(),
lng.intValue());
// get pixels for this point
Point overlayPoint = new Point();
projection.toPixels(thisGeoPoint,overlayPoint);
// did the user click within 30 pixels?
if ((Math.abs(clickedPoint.x - overlayPoint.x) < 30) && (Math.abs(clickedPoint.y - overlayPoint.y) < 30)){
// get a cursor to this record
Cursor thisCursor = TestApp.db.rawQuery("SELECT * FROM " + Database.DATABASE_TABLE_PINS + " WHERE CID='" + cursor.getString(Database.ID_COLUMN) + "'", null);
thisCursor.moveToFirst();
// create and show an instance of the PinDetailsDialog
PinDetailsDialog customiseDialog ;
// TODO this is a kludge, why does this throw an exception sometimes?
try{
customiseDialog = new PinDetailsDialog(mapView, context,thisCursor,context.getResources().getConfiguration().orientation);
customiseDialog.show();
} catch (Exception e){
customiseDialog = new PinDetailsDialog(mapView, mapView.getContext(),thisCursor,context.getResources().getConfiguration().orientation);
customiseDialog.show();
}
return true;
}
} catch (Exception e){
e.printStackTrace();
}
} while(cursor.moveToNext());
}
}
return true;
}
基本思想是获取用户在地图上单击的点,将该点转换为经纬度,然后迭代我的数据点以寻找匹配项。请注意,我正在使用 +/- 30 像素的命中测试(当我再次选择它时,我不会硬编码。
我把 TODO 留在了那里,以防你偶然发现类似的东西,但我怀疑这完全是我的 PinDetailsDialog 类实现中的某个问题。
我使用多个地图视图,每个地图视图都使用存储在 SQLite 表中的数据。我存储对游标的引用以读取 Mapview 的 tag 属性中的数据,因此调用 .getTag() 。