27370


Google Maps Android API で地図画面を現在地に固定したいです。  
スクロールの禁止をするまでは問題ないのですが、ピンチ操作でズームをする際や画面を回転する際に中心がずれてしまいます。

# やりたいこと

回転操作を以下の画像のようにすると、△が中心になって画面が回転するので、  
画面上のどこで回転操作をしても☆(現在地)を中心に画面が回転するようにしたいです。

[![画像1](https://i.stack.imgur.com/6SK5T.jpg)](https://i.stack.imgur.com/6SK5T.jpg)

ズーム操作の場合も画面上のどこをピンチしても、☆を中心に画面が回転するようにしたい。  
現状はピンチ操作をした箇所を中心にズームされてしまいます。  
[![画像2](https://i.stack.imgur.com/ZngIv.jpg)](https://i.stack.imgur.com/ZngIv.jpg)

他のアプリに例えるとIngressのように地図画面を固定したいですが、Google Maps Android APIで可能なのでしょうか。

以下は現在のコードです。  
java

[code]

    package hoge.hoge.hoge.map;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationManager;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.app.FragmentActivity;
    import android.os.Bundle;
    
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.UiSettings;
    import com.google.android.gms.maps.model.LatLng;
    
    public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, android.location.LocationListener {
    
      private GoogleMap map;
    
      private LocationManager locationManager;
    
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
    
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
          .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    
      }
    
    
      @Override
      public void onMapReady(GoogleMap googleMap) {
        map = googleMap;
    
        UiSettings uiSettings = map.getUiSettings();
        // scroll操作を禁止
        uiSettings.setScrollGesturesEnabled(false);
        // 回転操作を許可
        uiSettings.setRotateGesturesEnabled(true);
        // zoom操作を許可
        uiSettings.setZoomGesturesEnabled(true);
    
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
          // TODO パーミッションが許可されていなかった場合の処理を書こうね
          return;
        }
        map.setMyLocationEnabled(true);
    
        this.setUpLocationManager();
    
      }
    
      @Override
      public void onLocationChanged(Location location) {
        LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
    
        map.animateCamera(CameraUpdateFactory.newLatLng(latLng));
      }
    
      @Override
      public void onStatusChanged(String provider, int status, Bundle extras) {
    
      }
    
      @Override
      public void onProviderEnabled(String provider) {
    
      }
    
      @Override
      public void onProviderDisabled(String provider) {
    
      }
    
      private void setUpLocationManager() {
        if (locationManager == null) {
          this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
          if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO そのうちパーミッションが許可されていなかった場合の処理を書くよ
            return;
          }
          this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0,  this);
          this.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, this);
        }
      }
    }
    
[/code]

xml

[code]

    <fragment android:id="@+id/map"
              android:name="com.google.android.gms.maps.SupportMapFragment"
              xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:map="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context="hoge.hoge.hoge.map.MapsActivity"/>
    
[/code]


CC BY-SA 3.0
2016-02-25T01:22:33.680
22497
2016-07-06T04:17:42.093
2020-06-17T08:14:45.997
-1
14540
question
android java google-maps
Google Maps Android API を使った地図のカメラを固定したい


Google Maps Android API では `ScrollGesturesEnabled` を `false`
にしても、他のジェスチャにより位置が変わってしまうのは防げないと思います。（ダブルタップのズームでも位置が変わりますよね？）

`RotateGestureEnabled` や `ZoomGestureEnabled` も `false`
にした上で、これらのジェスチャーを自力で実装するしかないと思います。

回転(Rorate)やズーム(Scale)ジェスチャーの認識は、こちらのライブラリが便利です。

  * [Almeros/android-gesture-detectors: Gesture detector framework for multitouch handling on Android, based on Android's ScaleGestureDetector](https://github.com/Almeros/android-gesture-detectors)

あるいは、「地図の位置が変わった」タイミングで、強制的に位置を元に戻す、こともできますが、おそらくアプリの挙動がぎこちないものになってしまうでしょう。

  * [GoogleMap | Google APIs for Android | Google Developers](https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.html?hl=ja#public-methods)


CC BY-SA 3.0
2016-07-06T04:17:42.093
27370
2016-07-06T04:17:42.093
15190
22497
answer