【问题标题】:How to overlay text on a osm map using android如何使用 android 在 osm 地图上覆盖文本
【发布时间】:2013-12-13 17:38:16
【问题描述】:

我想在特定位置显示文本(用户名),我可以用图标毫无问题地做到这一点,但不能用文本做到这一点,我试图使文本可绘制,然后设置 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;
        }

    }       
}

【问题讨论】:

    标签: android overlay osmdroid


    【解决方案1】:

    您可以在 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);
        }
    

    很好的例子可以在这里找到: https://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/MyLocationOverlay.java?r=902

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多