今回は地図の表示やユーザーの操作に対する処理を設定する方法のメモです。
public class MainActivity extends AppCompatActivity implements SKPrepareMapTextureListener, SKMapSurfaceListener {
private SKCoordinate tokyo = new SKCoordinate(139.766084, 35.681382);
private SKMapSurfaceView mapView;
String mapResourcesDirPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SKMapSurfaceView.preserveGLContext = false;
setContentView(R.layout.activity_main);
mapResourcesDirPath = getFilesDir().getPath() + "/" + "SKMaps/";
if (!new File(mapResourcesDirPath).exists()) {
new SKPrepareMapTextureThread(this, mapResourcesDirPath, "SKMaps.zip", this).start();
} else {
initMapSetting();
}
}
@Override
public void onMapTexturesPrepared(boolean b) {
if (b) {
initMapSetting();
}
}
private void initMapSetting() {
SKMapsInitSettings initMapSettings = new SKMapsInitSettings();
initMapSettings.setMapResourcesPaths(mapResourcesDirPath,
new SKMapViewStyle(mapResourcesDirPath + "daystyle/", "daystyle.json"));
final SKAdvisorSettings advisorSettings = initMapSettings.getAdvisorSettings();
advisorSettings.setAdvisorConfigPath(mapResourcesDirPath + "Advisor");
advisorSettings.setResourcePath(mapResourcesDirPath + "Advisor/Languages");
advisorSettings.setLanguage(SKAdvisorSettings.SKAdvisorLanguage.LANGUAGE_EN);
advisorSettings.setAdvisorVoice("en");
initMapSettings.setAdvisorSettings(advisorSettings);
SKMaps.getInstance().initializeSKMaps(this, initMapSettings);
SKMapFragment mapFragment = new SKMapFragment();
mapFragment.setMapSurfaceListener(this);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.container, mapFragment).commit();
}
@Override
protected void onPause() {
super.onPause();
if (mapView != null) {
mapView.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (mapView != null) {
mapView.onResume();
}
}
@Override
public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) {
mapView = skMapViewHolder.getMapSurfaceView();
mapView.centerMapOnPosition(tokyo);
initMapSettings();
}
private void initMapSettings() {
//地図描画フレームレートの最大値を設定する。ただし、ユーザー操作は含まれない。
mapView.getMapSettings().setFrameRate(60);
//地図の表示領域が何を追尾モードを指定する。
//例えば下記のようにするとユーザーの位置が地図の中心に来るように追尾します。
mapView.getMapSettings().setFollowerMode(SKMapSettings.SKMapFollowerMode.NONE);
//地図の言語設定に使用する。
SKMapInternationalizationSettings skMapInternationalizationSettings = new SKMapInternationalizationSettings();
skMapInternationalizationSettings.setPrimaryLanguage(SKMaps.SKLanguage.LANGUAGE_RU);
mapView.getMapSettings().setMapInternationalizationSettings(skMapInternationalizationSettings);
settingsUserAction();
settingsMapObject();
settingsPoi();
settingsStyle();
settings3D();
//以下は使い方がわからない調査中メソッド
//mapView.getMapSettings().setDrawingOrder();
//mapView.getMapSettings().setTerrainEnabled(false);
//mapView.getMapSettings().setTerrainDisabledIfNoElevation(false);
//mapView.getMapSettings().setOrientationIndicatorType();
//mapView.getMapSettings().setGeneratedPoisShown(false);
//mapView.getMapSettings().setImportantPoisShown(true);
}
private void settings3D() {
//地図を3D表示したときのカメラを設定する。
SK3DCameraSettings sk3DCameraSettings = new SK3DCameraSettings();
sk3DCameraSettings.setTilt(60);
sk3DCameraSettings.setCenter(0.9f);
sk3DCameraSettings.setDistance(10);
mapView.getMapSettings().setCameraSettings(sk3DCameraSettings);
//地図を拡大した表示を2Dと3Dのどちらかを指定することができます。
mapView.getMapSettings().setMapDisplayMode(SKMapSettings.SKMapDisplayMode.MODE_3D);
//通りの名前をポップアップ風に表示する。true:ポップアップ表示/false:地図上に書き込み
mapView.getMapSettings().setStreetNamePopupsShown(false);
}
private void settingsStyle() {
// 地図を描画する時に使うスタイルファイルを設定する。
//SKMaps.zip内にはデフォルトで下記の4styleが存在します。
String daystyle = "daystyle";
String grayscalestyle = "grayscalestyle";
String nightstyle = "nightstyle";
String outdoorstyle = "outdoorstyle";
String style = nightstyle;
//コンストラクタの引数はstyleファイルが存在するフォルダとstyleファイルの名前です。
SKMapViewStyle skMapViewStyle = new SKMapViewStyle(mapResourcesDirPath + style + "/", style + ".json");
mapView.getMapSettings().setMapStyle(skMapViewStyle);
}
private void settingsPoi() {
//POIはランドマークのことです。
//POIの表示非表示を設定する true:表示/false:非表示
mapView.getMapSettings().setMapPoiIconsShown(true);
//地図上の都市情報の表示非表示を設定する true:表示/false:非表示
//country:国名/state:州名/city:都市名/town:街名/village:村名などなど
mapView.getMapSettings().setCityPoisShown(true);
}
private void settingsMapObject() {
//自転車専用レーンの表示非表示を設定する true:表示/false:非表示
mapView.getMapSettings().setShowBicycleLanes(true);
//一方通行の表示非表示を設定する true:表示/false:非表示
mapView.getMapSettings().setOneWayArrows(true);
//同一建物内の店舗数の表示非表示を設定する true:表示/false:非表示
mapView.getMapSettings().setHouseNumbersShown(true);
//自分の位置の表示非表示を設定する。true:表示/false:非表示
//初期表示位置はなぜか北極点
mapView.getMapSettings().setCurrentPositionShown(false);
//コンパスの表示-true:表示/false:非表示
mapView.getMapSettings().setCompassShown(true);
//コンパスの位置を指定する。右上を原点とする。
mapView.getMapSettings().setCompassPosition(new SKScreenPoint(10, 10));
}
private void settingsUserAction() {
//地図の移動の有効無効を設定する。true:有効/false:無効
mapView.getMapSettings().setMapPanningEnabled(false);
//地図の回転の有効無効を設定する true:有効/false:無効
mapView.getMapSettings().setMapRotationEnabled(false);
//Zoomの有効無効を設定する。true:有効/false:無効
mapView.getMapSettings().setMapZoomingEnabled(true);
//地図の移動に慣性力を付加する。 true:有効/false:無効
mapView.getMapSettings().setInertiaPanningEnabled(false);
//地図の回転に慣性力を付加する。 true:有効/false:無効
mapView.getMapSettings().setInertiaRotatingEnabled(false);
//地図のズームに慣性力を付加する。 true:有効/false:無効
mapView.getMapSettings().setInertiaZoomingEnabled(false);
//アンカーポイントを中心にZoomをするかを設定する。
// true:アンカー(地図中心)にZoomする。/false:ピンチしている指の間を中心にZoomする。
mapView.getMapSettings().setZoomWithAnchorEnabled(false);
//Zoomの上下限を設定するメソッド
//しかし、どんな値を設定しても特に変化がない。
mapView.getMapSettings().setZoomLimits(5f, 19f);
//リファレンスに説明が無く、値を変更しても反応しない。
//動作しないメソッドなのか?
mapView.getMapSettings().setMinimumZoomForTapping(0);
}
@Override
public void onActionPan() {}
@Override
public void onActionZoom() {}
@Override
public void onMapRegionChanged(SKCoordinateRegion skCoordinateRegion) {}
@Override
public void onMapRegionChangeStarted(SKCoordinateRegion skCoordinateRegion) {}
@Override
public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {}
@Override
public void onDoubleTap(SKScreenPoint skScreenPoint) {}
@Override
public void onSingleTap(SKScreenPoint skScreenPoint) {}
@Override
public void onRotateMap() {}
@Override
public void onLongPress(SKScreenPoint skScreenPoint) {}
@Override
public void onInternetConnectionNeeded() {}
@Override
public void onMapActionDown(SKScreenPoint skScreenPoint) {}
@Override
public void onMapActionUp(SKScreenPoint skScreenPoint) {}
@Override
public void onPOIClusterSelected(SKPOICluster skpoiCluster) {}
@Override
public void onMapPOISelected(SKMapPOI skMapPOI) {}
@Override
public void onAnnotationSelected(SKAnnotation skAnnotation) {}
@Override
public void onCustomPOISelected(SKMapCustomPOI skMapCustomPOI) {}
@Override
public void onCompassSelected() {}
@Override
public void onCurrentPositionSelected() {}
@Override
public void onObjectSelected(int i) {}
@Override
public void onInternationalisationCalled(int i) {}
@Override
public void onBoundingBoxImageRendered(int i) {}
@Override
public void onGLInitializationError(String s) {}
@Override
public void onScreenshotReady(Bitmap bitmap) {}
}
次回はSKMapSurfaceListenerの使い方のメモを作ろうと思います。