我想在特定位置显示文本(用户名),我可以用图标做没有问题,但不能用文本做,我试图使文本可绘制然后设置OverlayItem,但地图没有显示任何内容....请你的帮助。
我的班级:
package de.ifgi.sitcom.campusmapper.activities;
import java.util.ArrayList;
import java.util.Iterator;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import de.ifgi.sitcom.campusmapper.R;
import de.ifgi.sitcom.campusmapper.dialogs.SettingsDialog;
import de.ifgi.sitcom.campusmapper.io.TripleStoreQueries;
import de.ifgi.sitcom.campusmapper.outdoordata.Building;
//import android.view.GestureDetector;
public class OwnershipMapActivity extends SherlockFragmentActivity{
private int mMenuID = R.menu.ownership;
private MapView mMapView;
// private String mBuildingName;
private LoadBuildingShapeFromLODUM mLoadBuildingShapeFromLODUM;
// private GestureDetector mGestureDetector;
// private ItemizedIconOverlay<OverlayItem> mEntrancePositionOverlay;
// private GeoPoint mEntrancePosition;
public static final String EXTRA_BUILDING_NAME = "de.ifgi.sitcom.campusmapper.buildingName";
public static final String EXTRA_LAT_E6 = "de.ifgi.sitcom.campusmapper.lat";
public static final String EXTRA_LON_E6 = "de.ifgi.sitcom.campusmapper.lon";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ownership_map);
// Intent intent = getIntent();
// mBuildingName = "Bispinghof 20";//intent.getStringExtra(EXTRA_BUILDING_NAME);
mMapView = (MapView) findViewById(R.id.mapview);
mMapView.setMultiTouchControls(true);
mMapView.getController().setZoom(12);
float latMünster = 51.966667f; // in DecimalDegrees
float lngMünster = 7.633333f; // in DecimalDegrees
GeoPoint gpMünster = new GeoPoint((int) (latMünster * 1E6),
(int) (lngMünster * 1E6));
mMapView.getController().setCenter(gpMünster);
/*
* It might be that the async task of loading person names is still
* running. For this reason use .executeOnExecutor instead of .execute.
* This way we can have multiple async tasks at the same time.
*/
mLoadBuildingShapeFromLODUM = new LoadBuildingShapeFromLODUM();
mLoadBuildingShapeFromLODUM.executeOnExecutor(
AsyncTask.THREAD_POOL_EXECUTOR, "");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater().inflate(mMenuID, menu);
menu.findItem(R.id.action_score).setTitle(String.format("%04d", MyCampusMapperGame.getInstance().getMyScore()));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
// User clicked OK button
Intent intent = new Intent(this, MappingActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
setResult(Activity.RESULT_OK, intent);
finish();
return true;
case R.id.action_score:
Intent intentLeaderboard = new Intent(this, LeaderboardActivity.class);
intentLeaderboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intentLeaderboard);
return true;
case R.id.action_settings:
new SettingsDialog().show(getSupportFragmentManager(), "");
return true;
default:
break;
}
return true;
}
private class LoadBuildingShapeFromLODUM extends
AsyncTask<String, Void, ArrayList<Building>> {
@Override
protected ArrayList<Building> doInBackground(String... params) {
return new TripleStoreQueries().queryBuildingsCenter();
}
@Override
protected void onPostExecute(ArrayList<Building> result) {
System.out.println("mijail...post execute.");
// zoom to building center
if (result.size() > 0) {
System.out.println("mijail...post execute. result.getCenter()...shapesize"/* + result.getShape().size()*/);
mMapView.getController().setZoom(8);
}
Iterator<Building> myIterator = result.iterator();
final ArrayList<OverlayItem> centerList = new ArrayList<OverlayItem>();
// Resources res = getResources();
while (myIterator.hasNext())
{
Building myBuilding = myIterator.next();
if (myBuilding.getCenter() != null) {
Drawable d = new TextDrawable("test_text");
OverlayItem locationOverlayItem = new OverlayItem(myBuilding.getBuildingName().toString(), myBuilding.getBuildingName().toString(), myBuilding.getCenter());
locationOverlayItem.setMarker(d);
centerList.add(locationOverlayItem);
}
}
ItemizedIconOverlay<OverlayItem> centerOverlay = new ItemizedIconOverlay<OverlayItem>(
OwnershipMapActivity.this, centerList, null);
mMapView.getOverlays().add(centerOverlay);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
public class TextDrawable extends Drawable {
private final String text;
private final Paint paint;
public TextDrawable(String text) {
this.text = text;
this.paint = new Paint();
paint.setColor(Color.BLUE);
paint.setTextSize(10f);
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
paint.setShadowLayer(6f, 0, 0, Color.BLACK);
paint.setStyle(Paint.Style.FILL);
paint.setTextAlign(Paint.Align.LEFT);
}
@Override
public void draw(Canvas canvas) {
canvas.drawText(text, 0, 0, paint);
}
@Override
public void setAlpha(int alpha) {
paint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
paint.setColorFilter(cf);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
}
答案 0 :(得分:0)
您可以创建一个在osmdroid中扩展Overlay的类。然后覆盖onDraw方法并将文本直接绘制到画布上:
@Override
public void draw(final Canvas c, final MapView osmv, final boolean shadow) {
if (shadow) {
return;
}
c.drawText("some text", tx, ty + 5, this.mPaint);
}