マップ ビューに一連のマーカーがあります。どのマップ マーカーをタップしたかを検出できるように、マップ マーカーの境界を取得したいと考えています。私はstackoverflowで検索しましたが、すべてマップマーカー(描画可能)の境界を設定する方法を教えています。しかし、私が欲しいのは、すでに描いたマーカーの境界を取得することです。
助けてください
ありがとうございました
マップ ビューに一連のマーカーがあります。どのマップ マーカーをタップしたかを検出できるように、マップ マーカーの境界を取得したいと考えています。私はstackoverflowで検索しましたが、すべてマップマーカー(描画可能)の境界を設定する方法を教えています。しかし、私が欲しいのは、すでに描いたマーカーの境界を取得することです。
助けてください
ありがとうございました
このリンクは、コピーするのではなく、インスピレーションを得ることをお勧めするプロジェクトにつながります。どのメソッドが何に使用されているかを見てください。そこにいくつかの良いアイデアが見つかるかもしれません。あなた自身の理由でコピーすることはお勧めしません-プログラミング中に学ぶためです(単にコピーしても何も学びません)。
Android API の MapOverlay は、必要以上に複雑であることは認めますが、詳しく見てみるとすぐに理解できるでしょう。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);
したがって、基本的にピンの上にポップオーバーが必要な場合は、マップではなくオーバーレイに実装する必要があります。ピンに指示するためです。警告ダイアログ。
それが役に立てば幸い!