2012-10-06 13 views
5

Ben şimdi günler için beynimi rafa ve Googled ve SO'ed var ama raporlama başka birilerini bulmak için görünmüyor olabilir Böyle bir sorun (onu kaçırmış olabilir).Longpress üzerinde Android Map Marker aslında LongPressed (API 15 üzerinde) altında çizilir

Başkaları arasında uzun bastırmalarını dinleyen ve haritamdaki işaretleri işaretlemek için kullanıyorum özel bir Mapview Sınıfı var. API-8'de tamamdır. Ancak API-15 üzerinde işaretleyici, kullanıcı parmağının uzun bastırma yaptığı yerde yaklaşık 2 cm aşağıya iner. Bu, gerçek cihaz (samsung s2) ve eclipse emülatörü için de gözlenmiştir. Ayrıca, tüm yakınlaştırma seviyelerinde işaretlenen işaretleme alanına (yaklaşık 2 cm'lik bir uzaklık) karşı uzun basılan parmak alanı gözlenir.

İşte (Bir yerden çekti) Özelleştirilmiş MapView Sınıf geçerli:

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(); 
     } 
} 

Ve bu yukarıda Class diyoruz nasıl: Bir SetBounds sorun gibi görünüyor

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

Ben de aynı sorunu yaşıyorum. @Marka, herhangi bir çözüm bulduktan sonra lütfen paylaşın .... Teşekkürler –

+0

Üzgünüz @MukeshY bu yaklaşımı tamamen terk ettik ve kod üzerinden harita üzerinde sabit bir pin için tercih ettik. –

cevap

1

. Kalemin alt sağ köşesinde ortalamak için işaretçi sınırlarını ayarlıyorsunuz. Amaçlı davranış bu mu?

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

iyi şanslar:

Sen için sınır ayarı (en olağan türü veya belirteçleri olan) alt-merkezde merkezi işaretleyici ayarlayabilirsiniz.

+0

Teşekkürler @Luis ama çözümünüzü kullanmanız yine de aynı davranışa neden olur. Ayrıca bu parametreleri değiştirmeyi de denedim (cevaplarımdan bahsetmeyi unuttum). Üstelik, API 8 kullanarak özgün ayarda amaçlanan davranışı alıyorum. Bu davranışın şu anda gözlemlendiği API 15 üzerinde (diğer sürümlerde denemedim). –

+0

Çizilebilir için iki farklı sınır ayarlayacağınız gibi aynı davranışı almamalısınız. Aynı davranışı alıyorsanız, kesinlikle bir sınır probleminiz var demektir. Benzer bir problemi bildiren birisini hatırlıyorum, bir aktiviteyi aradıktan sonra, çekilemezden gelen sınırlar kayboldu, ama o zamana kadar herhangi bir çözüm kabul edilmedi. – Luis

+0

Sağ @luis! CustomSitesOverlay Sınıfındaki ayarlarla geçersiz kılındı. Ama bunu kaldırmayı denediniz ve gerçek uzun basma aktivitesinde işaretleyicileri çizen bir barebon var ve hala API Seviye 8 (ve bir HTC cihazı) ve yaklaşık 2 cm'lik bir ofset için işaretlenmiş alandaki işaretleyicilerin doğru yerleştirilmesini döndürüyorum (işaretleyici 2 cm aşağıda işaretlenmiştir) API seviyesi 15 için (ve bir Samsung S2 cihazı). 2cm'lik hata da tüm yakınlaştırma seviyelerinde gerçekleşir. –

İlgili konular