質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

Google Maps Android API で地図画面を固定したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,725
退会済みユーザー

退会済みユーザー

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

やりたいこと

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

画像1

ズーム操作の場合も画面上のどこをピンチしても、☆を中心に画面が回転するようにしたい。
現状はピンチ操作をした箇所を中心にズームされてしまいます。
イメージ説明

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

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

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);
    }
  }
}
<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"/>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る