これで数日間私の脳を痛めつけてしまいましたが、グーグルとSO'edが報告されていますそのような問題(それを逃したかもしれない)。ロングプレスのAndroidマップマーカーが実際にロングプレスされている領域の下にプロットされています(API 15の場合)
私はカスタマイズされたMapviewクラスを持っています。これは、longpressを聴いて、地図上にマーカーをプロットするために使用しています。それはAPI-8で大丈夫です。しかし、API-15では、ユーザーの指が長押しをしている場所の約2cm下にマーカーがオフセットされています。これは、実際のデバイス(samsung s2)とEclipseエミュレータの両方で観測されます。また、(約2cmオフセットされた)マーカー領域に対して、長押しされた指領域は、すべてのズームレベルで観察される。ここで
は私のカスタマイズされたのMapViewクラス(どこからそれをヤンク)である:
public class MyCustomMapView extends MapView {
public interface OnLongpressListener {
public void onLongpress(MapView view, GeoPoint longpressLocation);
}
static final int LONGPRESS_THRESHOLD = 500;
private GeoPoint lastMapCenter;
private Timer longpressTimer = new Timer();
private MyCustomMapView.OnLongpressListener longpressListener;
public MyCustomMapView(Context context, String apiKey) {
super(context, apiKey);
}
public MyCustomMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyCustomMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setOnLongpressListener(MyCustomMapView.OnLongpressListener listener) {
longpressListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
handleLongpress(event);
return super.onTouchEvent(event);
}
private void handleLongpress(final MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Finger has touched screen.
longpressTimer = new Timer();
longpressTimer.schedule(new TimerTask() {
@Override
public void run() {
GeoPoint longpressLocation = getProjection().fromPixels((int)event.getX(), (int)event.getY());
/*
* Fire the listener. We pass the map location
* of the longpress as well, in case it is needed
* by the caller.
*/
longpressListener.onLongpress(MyCustomMapView.this, longpressLocation);
}
}, LONGPRESS_THRESHOLD);
lastMapCenter = getMapCenter();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (!getMapCenter().equals(lastMapCenter)) {
// User is panning the map, this is no longpress
longpressTimer.cancel();
}
lastMapCenter = getMapCenter();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
// User has removed finger from map.
longpressTimer.cancel();
}
if (event.getPointerCount() > 1) {
// This is a multitouch event, probably zooming.
longpressTimer.cancel();
}
}
そして、これは私が上記のクラスを呼び出す方法です:それはは、setBounds問題のように見える
custom_marker = getResources().getDrawable(R.drawable.marker3);
custom_marker.setBounds(-custom_marker.getIntrinsicWidth(), -custom_marker.getIntrinsicHeight(), 0, 0);
customSitesOverlay = new CustomSitesOverlay(custom_marker);
mapView.getOverlays().add(customSitesOverlay);
customSitesOverlay.addOverlay(new OverlayItem(longpressLocation, "User Marker", id));
私も同じ問題に直面しています。 @Marka、あなたは解決策を見つけましたか?共有してください....ありがとう事前に –
申し訳ありません@MukeshY私たちはこれをすべて断念し、コードを介して地図上の固定ピンを選択しました。 –