2012-10-06 3 views
5

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)); 
+0

Anche io di fronte allo stesso problema. @Marka, hai trovato qualche soluzione quindi per favore condividi .... Grazie in anticipo –

+0

Mi dispiace @MukeshY abbiamo abbandonato questo approccio e abbiamo optato per un pin fisso sulla mappa tramite codice. –

risposta

1

Sembra un problema setBounds. Stai impostando i limiti del marker al centro nell'angolo in basso a destra del drawable. È questo il comportamento intuito?

È possibile impostare il contrassegno per centrare in basso al centro (che è il tipo più comune o marcatori) impostando i limiti per:

custom_marker.setBounds(-custom_marker.getIntrinsicWidth()/2, -custom_marker.getIntrinsicHeight(), custom_marker.getIntrinsicWidth()/2, 0); 

buona fortuna.

+0

Grazie a @Luis ma l'utilizzo della soluzione continua a comportare lo stesso comportamento. Ho anche provato a variare questi parametri anche nella mia ricerca di risposte (ho dimenticato di dirlo sul post scusa). Inoltre, sto ottenendo il comportamento previsto sull'impostazione originale utilizzando l'API 8. È proprio sulla API 15 che questo comportamento è attualmente osservato (non l'ho provato su altre versioni). –

+0

Non si dovrebbe ottenere lo stesso comportamento come si imposterebbero due limiti diversi per il drawable. Se stai seguendo lo stesso comportamento, hai sicuramente un problema con i limiti. Ricordo che qualcuno riferiva di un problema simile, che dopo aver chiamato un'attività si persero i limiti del drawable, ma al momento non fu accettata alcuna soluzione. – Luis

+0

Right @luis! Era sottoposto a override con le impostazioni della classe CustomSitesOverlay. Ma ho provato a rimuoverlo e fare un barebone per tracciare marcatori sull'effettiva attività di lunga pressione e sto ancora restituendo il corretto posizionamento dei marcatori sull'area premuta per il livello API 8 (e un dispositivo HTC) e uno sfalsamento di circa 2 cm (il marcatore è tracciato 2 cm sotto area premuto) per il livello API 15 (e un dispositivo Samsung S2). L'errore di 2 cm si verifica anche su tutti i livelli di zoom. –

Problemi correlati