android - 文本未显示在 MapView 叠加层上

标签 android text overlay android-mapview drawable

我能够显示特定区域的 map ,并带有显示确切位置的可绘制图标。问题是我看不到标记旁边的任何文字,就像您在谷歌地图上看到的那样。看起来您发送到 OverlayItem 的标题或 fragment 文本会显示,但事实并非如此。

我还没有在网上找到任何示例来说明如何在我所在位置的可绘制图标旁边放置某种文本...有人有示例吗?

我最初遵循的是 Google MapView 教程,但“Code Magician”有更好的版本: https://codemagician.wordpress.com/2010/05/06/android-google-mapview-tutorial-done-right/

(不幸的是 map 上的图标旁边没有文字标签)

最佳答案

这是我自己发现的……显然这是个大 secret ,或者什么的…… 无论如何,享受代码。愉快地将其复制并粘贴到整个“网络”中以泄露 secret 。

package myjunk.android.gps;

import java.util.List;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class ActivityMap extends MapActivity
{
    //member variables
    private static final String TAG = "MyMapActivity";
    private MapView mapView;
    private MapController mapController;
    private float mFloatMyLat;
    private float mFloatMyLon;
    private float mFloatOtherPersonLat;
    private float mFloatOtherPersonLon;

    private List<Overlay> mapOverlays;
    private Drawable drawable;
    private MapItemizedOverlay itemizedOverlay;


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        mapView = (MapView) findViewById(R.id.map);

        mapController = mapView.getController();

        //zoom to street level showing a few blocks
        //1 is world view, 21 is the tightest zoom possible
        mapController.setZoom(17);
        //mapView.setSatellite(true);//show satellite view
        mapView.setStreetView(false);//setting this to true causes blue lines around roads
        mapView.invalidate();

        mapOverlays = mapView.getOverlays();
        drawable = this.getResources().getDrawable(R.drawable.androidmarker);

        Bundle extras = getIntent().getExtras();
        if (extras != null)
        {
            //Get starting locations passed in by previous Activity
            mStrNickname = extras.getString("NickName");
            mFloatMyLat = extras.getFloat("MyLat");
            mFloatMyLon = extras.getFloat("MyLon");
            mFloatOtherPersonLat = extras.getFloat("OthersLat");
            mFloatOtherPersonLon = extras.getFloat("OthersLon");
        }


        itemizedOverlay = new MapItemizedOverlay(drawable, this, 30);//text size: 30

        //put my location on the map
        GeoPoint gPointMe = new GeoPoint((int)(mFloatMyLat  * 1000000),(int)(mFloatMyLon  * 1000000));
        OverlayItem overlayItem = new OverlayItem(gPointMe, "Me", "This is my location");
        itemizedOverlay.addOverlay(overlayItem);

        //show other person on map
        GeoPoint gPoint = new GeoPoint((int)(mFloatOtherPersonLat  * 1000000),(int)(mFloatOtherPersonLon  * 1000000));
        overlayItem = new OverlayItem(gPoint, mStrNickname, "This is that person's location");
        itemizedOverlay.addOverlay(overlayItem);

        //add overlay items to master list of overlays
        mapOverlays.add(itemizedOverlay);
        mapView.invalidate();

        mapView.setBuiltInZoomControls(true);

        //move map over to my position
        mapController.animateTo(gPointMe);
    }

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





package myjunk.android.gps;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;


public class MapItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
    //member variables
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;
    private int mTextSize;


    public MapItemizedOverlay(Drawable defaultMarker, Context context, int textSize)
    {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
        mTextSize = textSize;
    }


    //In order for the populate() method to read each OverlayItem, it will make a request to createItem(int)
    // define this method to properly read from our ArrayList
    @Override
    protected OverlayItem createItem(int i)
    {
        return mOverlays.get(i);
    }


    @Override
    public int size()
    {
        return mOverlays.size();
    }

    @Override
    protected boolean onTap(int index)
    {
        OverlayItem item = mOverlays.get(index);

        //Do stuff here when you tap, i.e. :
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();

        //return true to indicate we've taken care of it
        return true;
    }

    @Override
    public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)
    {
        super.draw(canvas, mapView, shadow);

        if (shadow == false)
        {
            //cycle through all overlays
            for (int index = 0; index < mOverlays.size(); index++)
            {
                OverlayItem item = mOverlays.get(index);

                // Converts lat/lng-Point to coordinates on the screen
                GeoPoint point = item.getPoint();
                Point ptScreenCoord = new Point() ;
                mapView.getProjection().toPixels(point, ptScreenCoord);

                //Paint
                Paint paint = new Paint();
                paint.setTextAlign(Paint.Align.CENTER);
                paint.setTextSize(mTextSize);
                paint.setARGB(150, 0, 0, 0); // alpha, r, g, b (Black, semi see-through)

                //show text to the right of the icon
                canvas.drawText(item.getTitle(), ptScreenCoord.x, ptScreenCoord.y+mTextSize, paint);
            }
        }
    }


    public void addOverlay(OverlayItem overlay)
    {
        mOverlays.add(overlay);
        populate();
    }


    public void removeOverlay(OverlayItem overlay)
    {
        mOverlays.remove(overlay);
        populate();
    }


    public void clear()
    {
        mOverlays.clear();
        populate();
    }

}

关于android - 文本未显示在 MapView 叠加层上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5070492/

相关文章:

text - JavaFX:文本字段的红色边框

ruby - 在 Ruby 中向 gstreamer 视频添加叠加文本

Android C2DM Registration_ID 最大尺寸

C++ 读取长的非分隔整数,将它们分开并放入二维数组中

android - Android 服务中的持久字段

Python从段落中提取信息

filter - FFmpeg AVFilter 以编程方式覆盖/水印

javascript - jQuery 到常规 Javascript - 覆盖

android - 以编程方式创建 TextView 时如何在下方设置按钮?

Android:无法暂停 Activity :java.lang.IllegalArgumentException:服务未注册: