2012-10-06 6 views
5

मैं इस पर अपने दिमाग को रैकिंग कर रहा हूं और इस पर गुगल और सोया है लेकिन किसी और को रिपोर्टिंग नहीं मिल रहा है ऐसी समस्या (इसे याद कर सकता था)।लॉन्गप्रेस पर एंड्रॉइड मैप मार्कर उस क्षेत्र के नीचे प्लॉट किया गया है जो वास्तविक रूप से लंबे समय तक दबाया जाता है (एपीआई 15 पर)

मेरे पास एक अनुकूलित नक्शादृश्य वर्ग है जो दूसरों के बीच लम्बाई के लिए सुनता है और मेरे मानचित्र पर मार्कर प्लॉट करने के लिए इसका उपयोग कर रहा हूं। यह एपीआई -8 पर ठीक है। लेकिन एपीआई -15 पर मार्कर को लगभग 2 सेमी नीचे ऑफसेट किया जाता है जहां उपयोगकर्ता उंगली लम्बाई कर रही है। यह वास्तविक डिवाइस (सैमसंग एस 2) और ग्रहण एमुलेटर दोनों के लिए मनाया जाता है। इसके अलावा सभी ज़ूम स्तरों पर मार्कर क्षेत्र प्लॉट (लगभग 2 सेमी तक ऑफसेट) बनाम उंगली क्षेत्र लंबे समय से दबाया जाता है।

यहाँ मेरी अनुकूलित MapView क्लास (कहीं से यह yanked) है:

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

और यह कैसे मैं कक्षा से ऊपर कहते हैं:

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

मुझे भी एक ही समस्या का सामना करना पड़ रहा है। @ मार्कका, क्या आपको कोई समाधान मिला है, कृपया साझा करें .... अग्रिम धन्यवाद –

+0

क्षमा करें @MukeshY हमने इस दृष्टिकोण को पूरी तरह से छोड़ दिया और कोड के माध्यम से मानचित्र पर एक निश्चित पिन का चयन किया। –

उत्तर

1

यह एक setBounds समस्या की तरह लग रहा है। आप मार्कर सीमाओं को ड्रॉइंग के निचले-दाएं कोने में केंद्र में सेट कर रहे हैं। क्या यह इरादा व्यवहार है?

आप नीचे केंद्र में केंद्र के लिए मार्कर सेट कर सकते हैं करने के लिए सीमा की स्थापना (जो सबसे सामान्य प्रकार या मार्कर है):

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

अच्छी किस्मत।

+0

धन्यवाद @Luis लेकिन आपके समाधान का उपयोग करने से अभी भी वही व्यवहार होता है। मैंने जवाबों के लिए मेरी खोज में इन पैरामीटर को अलग करने की भी कोशिश की है (पोस्ट माफ करना पर उल्लेख करना भूल गए हैं)। इसके अलावा, एपीआई 8 का उपयोग कर मूल सेटिंग पर इच्छित व्यवहार प्राप्त कर रहा हूं। यह सिर्फ एपीआई 15 पर है कि यह व्यवहार वर्तमान में देखा गया है (इसे अन्य संस्करणों पर आजमाया नहीं है)। –

+0

आपको वही व्यवहार नहीं करना चाहिए क्योंकि आप आकर्षित करने के लिए दो अलग-अलग सीमाएं निर्धारित करेंगे। यदि आप एक ही व्यवहार कर रहे हैं तो आपको निश्चित रूप से बाध्य समस्या है। मुझे याद है कि किसी ने भी इसी तरह की समस्या के बारे में रिपोर्टिंग की है, कि एक गतिविधि को कॉल करने के बाद ड्रॉइंग से सीमाएं खो गईं, लेकिन उस समय तक कोई समाधान स्वीकार नहीं हुआ था। – Luis

+0

राइट @luis! इसे कस्टमसाइट्स ओवरले क्लास पर सेटिंग्स के साथ ओवरराइड किया जा रहा था। लेकिन इसे हटाने की कोशिश की है और वास्तविक लंबी प्रेस गतिविधि पर मार्करों की साजिश रचने की कोशिश की है और अभी भी एपीआई लेवल 8 (और एक एचटीसी डिवाइस) के लिए दबाए गए क्षेत्र पर मार्करों के सही प्लेसमेंट को वापस कर रहा हूं और लगभग 2 सेमी ऑफसेट (मार्कर नीचे 2 सेमी प्लॉट किया गया है क्षेत्र दबाया गया) एपीआई स्तर 15 (और सैमसंग एस 2 डिवाइस) के लिए। 2 सेमी त्रुटि सभी ज़ूम स्तरों पर भी होती है। –

संबंधित मुद्दे