Mi sto tormentando da giorni su questo e ho cercato su Google e SO ma non riesco a trovare nessun altro che segnala tale problema (potrebbe averlo perso).L'indicatore di mappa Android su Longpress è tracciato al di sotto dell'area che è effettivamente LongPressed (su API 15)
Ho una classe Mapview personalizzata che ascolta longpress tra gli altri e la sto usando per tracciare marcatori sulla mia mappa. Va bene su API-8. Ma su API-15 il marcatore è compensato di circa 2 cm sotto il dito dell'utente che sta facendo la longpress. Questo è stato osservato sia per il dispositivo reale (samsung s2) che per l'emulatore di eclipse. Anche l'area del dito premuto a lungo contro l'area del marker tracciata (offset di circa 2 cm) viene osservata su tutti i livelli di zoom.
Ecco il mio personalizzato MapView Class (strappato da qualche parte):
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();
}
}
e questo è come io chiamo la classe di cui sopra:
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));
Anche io di fronte allo stesso problema. @Marka, hai trovato qualche soluzione quindi per favore condividi .... Grazie in anticipo –
Mi dispiace @MukeshY abbiamo abbandonato questo approccio e abbiamo optato per un pin fisso sulla mappa tramite codice. –