2013-06-20 11 views
8

GoogleマップフラグメントのonDrag Listenerをセットアップしようとしていますが、起動するドラッグイベントを取得できません。マップはドラッグイベントを直接サポートしていないため、ビューのドラッグリスナーを実装しようとしています。 onMarkerDragイベントについて知っていますが、マーカーを移動しようとしているわけではないので、それは良くありません。Googleマップv2フラグメントのOnDragListenerの作成

マップのドラッグイベントをトラップする理由は2つあります。ユーザーがマップをパンした場合

最初に検出します。表示されていない場合は、画面上にその位置を保持し、地図上にない場合はその位置にアニメーション表示するのが好きです。彼らが地図をパ​​ンした場合、私は彼らが見たいものを知っていて、画面上の場所を強制すると思います。 (これはAPIに含める必要があるようです)

トラッピングの第2の理由は、マップ上に線やポリゴンを描画できるようにするためです。私はonTapイベント(ポイントを追加する)でこれを行うことができますが、私もそれらを自由に手放すことができるようにしたいと思います。

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

} 

マップが正常に動作します

私のコードは次のようになります。リスナーはインスタンス化しますが、onDragイベントは発生しません。何か案は?

+0

あなたがマーカーをドラッグについて話している場合、v2は確かにドラッグリスナーを持っています。 'onMarkerDragListener'を実装してください – tyczj

+1

@tyczjマーカーをドラッグするのではなく、マップ全体をパンします。 Tim:マップがイベントを消費するため、これは機能しません。あなたの質問を更新し、達成したいことを言いなさい、おそらくは解決策を見つけることができます。 –

答えて

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

@Aleh Imこれに続いて。私はログを取得しています。私は移動イベントだけを聞きたい。どのようにこのイベントだけを取得する –

+1

@ QadirHussain私はあなたの質問を正確に理解すれば、if(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); 
      } 
     } 
    }); 
関連する問題