2013-06-20 14 views
8

के लिए ऑनड्रागलिस्टर बनाना, मैं एक Google मानचित्र खंड के लिए ऑन-ड्रैग श्रोता सेट अप करने का प्रयास कर रहा हूं, लेकिन ड्रैग ईवेंट को आग में नहीं मिल सकता। चूंकि नक्शा सीधे ड्रैग इवेंट्स का समर्थन नहीं करता है, इसलिए मैं व्यू के लिए ड्रैग श्रोता को लागू करने की कोशिश कर रहा हूं। मैं मार्कर ड्रैग घटना के बारे में जानता हूं, लेकिन यह मुझे अच्छा नहीं करता क्योंकि मैं मार्करों को चारों ओर स्थानांतरित करने की कोशिश नहीं कर रहा हूं।Google मानचित्र v2 फ्रैगमेंट

नक्शे खींचें घटनाओं को फँसाने के लिए कारण दोहरा है:

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

फँसाने का दूसरा कारण उपयोगकर्ताओं को मानचित्र पर रेखाएं और बहुभुज आकर्षित करने की अनुमति देना है। मैं इसे ऑनट घटनाओं (अंक जोड़कर) के साथ कर सकता हूं, लेकिन मैं उन्हें इसे मुक्त करने में भी सक्षम होना चाहता हूं।

मेरे कोड इस तरह दिखता है:

MainActivity:

mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    setUpMapIfNeeded(); 
    mMapView = findViewById(R.id.map); 
    myMapDragListener = new MapDragListener(); 
    mMapView.setOnDragListener(myMapDragListener); 

श्रोता:

public class MapDragListener implements OnDragListener { 
    /** 
    * 
    */ 
    public MapDragListener() { 
     super(); 
     say.logCat("MapDragListener: I'm ALIVE!!!!"); 
    } 

    private AkamaiAnnounce say = new AkamaiAnnounce(); 
    private boolean inDrag; 
    private boolean hasPanned=false; 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
     say.logCat("MapDragListener.onDrag: " + event.toString()); 
     //String dotTAG = (String) getTag(); 
     if (event.getLocalState() != this) { 
      return false; 
     } 
     boolean myResult = true; 
     int action = event.getAction(); 
     float x = event.getX(); 
     float y = event.getY(); 
     switch (action) { 
     case DragEvent.ACTION_DRAG_STARTED: 
      inDrag = true; 
      break; 
     case DragEvent.ACTION_DRAG_LOCATION: 
      break; 
     case DragEvent.ACTION_DRAG_ENTERED: 
      break; 
     case DragEvent.ACTION_DRAG_EXITED: 
      break; 
     case DragEvent.ACTION_DROP: 
      myResult = false; 
      break; 
     case DragEvent.ACTION_DRAG_ENDED: 
      inDrag = false; // change color of original dot back 
      hasPanned=true; 
      break; 
     default: 
      myResult = false; 
      break; 
     } 
     return false; 
     //return myResult; 

    } 

    public boolean hasPanned() { 
     return hasPanned; 
    } 

    public void setHasPanned(boolean hasPanned) { 
     this.hasPanned = hasPanned; 
    } 

} 

नक्शा ठीक काम करता है। श्रोता तत्काल, लेकिन मेरी ऑनड्रैग घटना कभी नहीं आग लगती है। कोई विचार?

+0

अगर नक्शा गंदा था बताने के लिए अगर आप खींच मार्कर के बारे में बात कर रहे हैं समान की तरह कुछ किया था, V2 निश्चित रूप से खींचें श्रोताओं करता है। 'लागू करें OnMarkerDragListener' – tyczj

+1

@tyczj यह मार्कर खींचने के बारे में नहीं है, बल्कि पूरे मानचित्र को पैनिंग करने के बारे में नहीं है। टिम: यह काम नहीं करेगा क्योंकि नक्शा घटनाओं का उपभोग करता है। अपना प्रश्न अपडेट करें, कहें कि आप क्या हासिल करना चाहते हैं और शायद हम समाधान ढूंढ सकते हैं। –

उत्तर

18

1) आवरण वर्ग बनाएँ:

public class MapWrapperLayout extends FrameLayout { 

    public interface OnDragListener { 
     public void onDrag(MotionEvent motionEvent); 
    } 

    private OnDragListener mOnDragListener; 

    public MapWrapperLayout(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     if (mOnDragListener != null) { 
      mOnDragListener.onDrag(ev); 
     } 
     return super.dispatchTouchEvent(ev); 
    } 

    public void setOnDragListener(OnDragListener mOnDragListener) { 
     this.mOnDragListener = mOnDragListener; 
    } 
} 

2) MapFragment वर्ग के उपवर्ग बनाएँ:

public class CustomMapFragment extends SupportMapFragment { 

    private View mOriginalView; 
    private MapWrapperLayout mMapWrapperLayout; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mOriginalView = super.onCreateView(inflater, container, savedInstanceState); 

     mMapWrapperLayout = new MapWrapperLayout(getActivity()); 
     mMapWrapperLayout.addView(mOriginalView); 

     return mMapWrapperLayout; 
} 

    @Override 
    public View getView() { 
     return mOriginalView; 
    } 

    public void setOnDragListener(MapWrapperLayout.OnDragListener onDragListener) { 
     mMapWrapperLayout.setOnDragListener(onDragListener); 
    } 

3,1) अंत में, अपनी गतिविधि में:

// Google map init block 
    CustomMapFragment customMapFragment = ((CustomMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)); 
    customMapFragment.setOnDragListener(new MapWrapperLayout.OnDragListener() { 
     @Override 
     public void onDrag(MotionEvent motionEvent) { 
      Log.d("ON_DRAG", String.format("ME: %s", motionEvent)); 
      // Handle motion event: 
     } 
    }); 
    GoogleMap map = customMapFragment.getMap(); 

3,2)। .. और आपके लेआउट में:

<fragment android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:name="your.package.CustomMapFragment"/> 
+0

कृपया ध्यान दें कि अभी भी ऐसे मुद्दे हैं [4636] (https://code.google.com/p/gmaps-api-issues/issues/detail?id=4636)। – JJD

+0

@ एलेह इम इसके बाद। मुझे लॉग मिल रहा है। मैं केवल चाल घटना सुनना चाहता हूं। इस घटना को केवल –

+1

@QadirHussain कैसे प्राप्त करें यदि मैं वास्तव में आपके प्रश्न को समझता हूं, तो: यदि (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {...} – Aleh

4

ड्रैग ईवेंट श्रोता को GoogleMap युक्त एक टुकड़ा प्राप्त करने के लिए, Google के नीचे की विधि का उपयोग कर सकते हैं। हम मानचित्र की लक्ष्य स्थिति प्राप्त कर सकते हैं।

googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { 
      @Override 
      public void onCameraIdle() { 
       Log.e(TAG,"==camera idle=="+ googleMap.getCameraPosition().target); 

      } 
     }); 
googleMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { 
     @Override 
     public void onCameraMoveStarted(int reason) { 
      if (reason ==REASON_GESTURE) { 
       isMaptouched=true; 
       Toast.makeText(getActivity(), "The user gestured on the map.", 
         Toast.LENGTH_SHORT).show(); 
      } else if (reason ==REASON_API_ANIMATION) { 
       Toast.makeText(getActivity(), "The user tapped something on the map.", 
         Toast.LENGTH_SHORT).show(); 
      } else if (reason ==REASON_DEVELOPER_ANIMATION) { 
       Toast.makeText(getActivity(), "The app moved the camera.", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 


    }); 
+1

पिछले कुछ दिनों से इसकी तलाश में .. :) –

0

मैं एक BehaviorSubject का उपयोग कर (उपयोगकर्ता द्वारा ले जाया गया)

storeMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() { 
     @Override 
     public void onCameraMoveStarted(int reason) { 
      if (reason == REASON_GESTURE) { 
       mapIsDirty.onNext(true); 
      } 
     } 
    }); 
    storeMap.setOnCameraIdleListener(new OnCameraIdleListener() { 
     @Override 
     public void onCameraIdle() { 
      if(mapIsDirty.getValue()) { 
      // Do happy things 
      mapIsDirty.onNext(false); 
      } 
     } 
    }); 
संबंधित मुद्दे