2013-06-20 21 views
8

Bir google harita parçası için bir onDrive Dinleyicisi kurmaya çalışıyorum, ancak sürükleme etkinliğinin tetiklenmesini sağlayamıyorum. Harita doğrudan sürükleme etkinliklerini desteklemediğinden, Görünüm için bir sürükle dinleyici kullanmaya çalışıyorum. OnMarkerDrag olayı hakkında biliyorum, ama bu bana iyi bir şey yapmıyor çünkü işaretçileri hareket ettirmeye çalışmıyorum.Google Map v2 Fragmanı için OnDragListener Oluşturma

harita sürükleme yakalama olayları nedeni iki yönlüdür: kullanıcı haritayı panned ise

İlk algılamak için. Eğer yapmadılarsa, ekranda yerlerini saklamayı ve haritada bulunmuyorsa konumlarına animasyon yapmayı severim. Haritayı kaydırmışlarsa, ekranda görmek istediklerini ve ekrana zorlamak istediklerini biliyorlar. (bu, API'ye dahil edilmesi gereken bir şey gibi görünüyor)

Yakalamanın ikinci sebebi, kullanıcıların haritada çizgiler ve çokgenler çizmesine izin vermektir. Bunu onTap olayları ile yapabilirim (puan ekleyerek), ama serbest bırakmalarını da isterim.

Benim kod şöyle görünür:

MainActivity:

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

Dinleyici:

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

} 

haritası çalışıyor. Dinleyici ortaya çıkar, ancak onDrag etkinliğim asla patlamaz. Herhangi bir fikir?

+0

haritası kirli olmadığını anlatmak için bir BehaviorSubject kullanarak benzer gibi bir şey yaptım v2 kesinlikle sürükleme dinleyicileri var. 'OnMarkerDragListener' öğelerini kullanın – tyczj

+1

@tyczj Bu, işaretçileri sürüklemeyle değil, tüm haritayı kaydırmakla ilgilidir. Tim: Bu işe yaramaz çünkü harita olayları tüketir. Sorunuzu güncelleyin, neyi başarmak istediğinizi söyleyin ve belki bir çözüm bulabiliriz. –

cevap

18

1) sarıcı sınıf oluşturun:

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 sınıfının alt sınıfını oluşturun:

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) Son olarak, faaliyette:

// 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). .. ve düzeninizde:

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

Hâlâ hala var olduğunu unutmayın [4636] (https://code.google.com/p/gmaps-api-issues/issues/detail?id=4636). – JJD

+0

@Aleh Im bunu takip ediyor. Ben Log'u alıyorum. Sadece hareket olayını dinlemek istiyorum. Bu olayı nasıl elde edebilirim? –

+1

@QadirHussain Sorunuzu tam olarak anlarsam, o zaman: (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {...} – Aleh

4

Sürükle etkinlik dinleyicisine googleMap içeren bir parça almak için, aşağıdaki google yöntemini kullanabilirsiniz. Haritanın hedef pozisyonunu alabiliriz.

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

Bunu son birkaç gündür arıyorum .. :) –

0

Sana sürükleyerek belirteçler bahsediyoruz if (kullanıcı tarafından taşınan)

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