2017-01-11 7 views
1

私のアプリで地図を1本の指で物事をポケモンにして360度回転できるようにするために、私は以下の解決策を考え出しました。Googleマップ:Googleマップでのイベントの検出と移動

マップにonTouchListenerが設定されていないため、マップを含むフラグメント全体を表示し、onTouchListenerを追加しました。次のコードは、ユーザーが1本の指をドラッグすると地図を回転させ、実際にはかなりうまく動いています。

previousMapTouchX = 0.0f; 
    previousMapTouchY = 0.0f; 

    coveringView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 

      float x = motionEvent.getX(); 
      float y = motionEvent.getY(); 

      switch (motionEvent.getAction()) { 

       case MotionEvent.ACTION_MOVE: 

        Log.e("MAP", "MOVE"); 

        float dx = x - previousMapTouchX; 
        float dy = y - previousMapTouchY; 

        // reverse direction of rotation above the mid-line 
        if (y > coveringView.getHeight()/2) { 
         dx = dx * -1 ; 
        } 

        // reverse direction of rotation to left of the mid-line 
        if (x < coveringView.getWidth()/2) { 
         dy = dy * -1 ; 
        } 

        CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude()), 
          googleMap.getCameraPosition().zoom, MAX_TILT, 
          googleMap.getCameraPosition().bearing + ((dx + dy) * TOUCH_SCALE_FACTOR))); 

        googleMap.moveCamera(cameraUpdate); 
        break; 

       case MotionEvent.ACTION_DOWN: 
        Log.e("MAP", "DOWN"); 
        return false; 

      } 

      previousMapTouchX = x; 
      previousMapTouchY = y; 
      return true; 

     } 
    }); 

問題は、しかし、私はマップを回転させることができながら、上部のビューはタッチイベントのすべてを消費しているので、マーカーは、アンタッチャブルになるということです。そこで、MotionEvent.ACTION_DOWNが検出された場合にfalseを返すケースを追加しました。ただし、これは、ACTION_MOVEアクションの前に必ずACTION_DOWNアクションを実行するため、マップ回転コードに決して到達しないことを意味します。

地図を回転させることなく、マップマーカーを選択できないか、地図マーカーを選択できない状態で、地図を適切に回転できる状況に陥っています。

どのように私はこの作業を得るかもしれないかに関する提案はありますか? GoogleマップがonTouchListenerを持つことができれば、ずっと簡単です。

答えて

1

あなたはすべてのマップジェスチャーを無効にして被覆ビューからマップビューにタッチイベントを送出することができます魔法のように

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 
    private GoogleMap mMap; 
    private View mapView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapView = mapFragment.getView(); // get the map view to dispatch touch events to it 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(final GoogleMap googleMap) { 
     mMap = googleMap; 

     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(40, 4), 18)); 
     mMap.addMarker(new MarkerOptions().position(new LatLng(40, 4)).title("My marker")); 

     mMap.getUiSettings().setAllGesturesEnabled(false); // disable all the map gestures 

     View coveringView = findViewById(R.id.coveringView); 
     coveringView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(final View view, final MotionEvent motionEvent) { 
       // Do your stuff here 

       mapView.dispatchTouchEvent(motionEvent); // dispatch the touch event from the covering view to the map view 
       return true; 
      } 
     }); 
    } 
} 
+0

作品!あまりにも多くのAntonio – Dportology

関連する問題