2017-01-11 2 views
1

В попытке повернуть карту в моем приложении на 360 градусов вокруг пользователя одним пальцем (стиль покемона в стиле покера) Я придумал следующее решение.Карты Google: обнаружение и перемещение событий на карте google

Я заложил представление обо всем фрагменте, который содержит карту, и добавил к нему onTouchListener, поскольку на карте не может быть установлен onTouchListener. Приведенный ниже код поворачивает карту, когда пользователь тащит один палец, и на самом деле он работает достаточно хорошо.

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; 

     } 
    }); 

Проблема, однако, что в то время как я могу повернуть карту, маркеры становятся неприкасаемыми, потому что вид сверху потребляет все события прикосновения. Поэтому я добавил случай, чтобы вернуть false, если обнаружен MotionEvent.ACTION_DOWN. Это также работает, однако, поскольку пользователь, очевидно, всегда выполняет действие ACTION_DOWN перед действием ACTION_MOVE, это означает, что код вращения карты никогда не был достигнут.

Я застрял в ситуации, когда я могу либо правильно повернуть карту, не имея возможности выбрать маркеры карты, либо выбрать маркеры карт, не имея возможности повернуть карту.

Есть ли у кого-нибудь предложения о том, как я могу заставить это работать? Было бы намного проще, если бы на карте 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

работает как шарм! Большое спасибо Антонио – Dportology

Смежные вопросы