Получить границы пользовательского маркера карты в Android

У меня есть набор маркеров на моей карте. Я хочу получить границы маркера карты, чтобы я мог определить, какой маркер карты я нажал. Я искал в stackru, но все рассказывают, как установить границы маркера карты (рисовать). Но я хочу получить границы маркера, который я уже нарисовал.

Пожалуйста помоги

Благодарю вас

1 ответ

Решение

Эта ссылка ведет к проекту, который я советую не копировать, а черпать вдохновение. Посмотрите, какие методы используются для чего, и, возможно, вы сможете найти там хорошие идеи. Я не рекомендую копировать по вашей собственной причине - учиться во время программирования (вы ничего не узнаете, если просто скопируете).

Я признаю, что MapOverlay в Android API немного сложнее, чем должно быть, но если вы присмотритесь к нему поближе, вы быстро в него разберетесь. Я рекомендую начать здесь, по мне неизвестной причине, Google выделил это как внешнюю библиотеку и больше не доступно на старой странице разработчика. Присмотритесь к Itemized Overlay, который я использую для рисования объектов на карте. Вам нужно будет расширить этот класс и переопределить несколько методов. Как видите, у него уже есть метод onTap, который вы просто переопределяете:)

Чтобы убедиться, что вы понимаете, что я имею в виду - вот мое собственное наложенное наложение:

package example;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources.NotFoundException;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
/**
 * Paints and stores all the Overlays for CurrentPositionActivity, overrides ItemizedOverlay<OvelayItem>.
 * @author Michal Svacha
 * 
 */
 public class ItemizedOverlayBeta extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); // ArrayList for the OverlayItems
Context mContext; // Context where the Overlays are to eb displayed
private ArrayList<String> mObjIDs = new ArrayList<String>();
DetailLoader dl;

public void addID(String objId) {
    mObjIDs.add(objId);
}

/**
 * Public constructor.
 * @param defaultMarker
 * @param context
 */
public ItemizedOverlayBeta(Drawable defaultMarker, Context context) {
    super(boundCenterBottom(defaultMarker)); // Calls the constructor of the parent.
    mContext = context;
}

/**
 * Adds overlay to ArrayList.
 * @param overlay
 */
public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

/**
 * Returns OverlayItem based on the index.
 * @param index - position where the OverlayItem is stored in the ArrayList.
 * @return desired OverlayItem.
 */
@Override
protected OverlayItem createItem(int index) {
  return mOverlays.get(index);
}

/**
 * Returns the size of the ArrayList
 * @return calls method size() on the ArrayList
 */
@Override
public int size() {
  return mOverlays.size();
}

/**
 * When tapped on screen this method is called and creates AlertDialog with little data.
 * @param index - place where tapped
 * @return always true
 */
@Override
protected boolean onTap(int index) {
  dl = new DetailLoader();
  try {
    if(dl.execute(index).get()) {
        OverlayItem item = mOverlays.get(index);
        final AlertDialog dialog = new AlertDialog.Builder(mContext).create();
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet() +"\n" + "Hello");
        dialog.setButton("close", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
      });
      dialog.show();
      }
} catch (NotFoundException e) {
    return false;
} catch (InterruptedException e) {
    return false;
} catch (ExecutionException e) {
    return false;
}
  return true;
}

public void populateNow(){
    populate();
}

private class DetailLoader extends AsyncTask<Integer, Void, Boolean>{
    ProgressDialog pd;

    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(mContext);
        pd = ProgressDialog.show(mContext, "","Loading",true);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if(pd != null) pd.dismiss();
    }

    @Override
    protected Boolean doInBackground(Integer... params) {
        // Load data
        return true;
    }
}
}

Который затем отображается на карте следующим образом:

ItemizedOverlayBeta itemizedMoving = new ItemizedOverlayBeta(this.getResources().getDrawable(R.drawable.ic_pin_moving), this);
GeoPoint gp = new GeoPoint((int)(coordinate * 1E6),(int)(coordinate2 * 1E6));
OverlayItem oi = new OverlayItem(gp, "string for the alert dialog";    
itemizedMoving.populateNow();
CurrentPositionActivity.mapOverlays.add(itemizedMoving);

Таким образом, в основном, когда вам нужно всплывающее окно над булавкой, вы должны реализовать его в оверлее, а не на карте, потому что, вы говорите булавке - эй, когда я нажимаю на вас, вам нужно перерисовать себя, точно так же, как я отображаю диалог оповещения.

Надеюсь, поможет!

Другие вопросы по тегам