Google Maps Android API を使った地図のカメラを固定したい
Google Maps Android API で地図画面を現在地に固定したいです。
スクロールの禁止をするまでは問題ないのですが、ピンチ操作でズームをする際や画面を回転する際に中心がずれてしまいます。
やりたいこと
回転操作を以下の画像のようにすると、△が中心になって画面が回転するので、
画面上のどこで回転操作をしても☆(現在地)を中心に画面が回転するようにしたいです。
ズーム操作の場合も画面上のどこをピンチしても、☆を中心に画面が回転するようにしたい。
現状はピンチ操作をした箇所を中心にズームされてしまいます。
他のアプリに例えるとIngressのように地図画面を固定したいですが、Google Maps Android APIで可能なのでしょうか。
以下は現在のコードです。
java
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);
}
}
}
xml
<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"/>