【AndroidでSkobblerを使う】SKMapViewHolderとSKMapSurfaceView

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

Skobblerで地図を表示するにはクラス:SKMapFragmentを使うと簡単に表示ができます。
このSKMapFragmentは地図にアクセスするクラス:SKMapViewHolderと地図を表示するクラス:SKMapSurfaceViewを持っています。
しかし、SKMapViewHolderとSKMapSurfaceViewは初期化に少し時間が必要になります、そのため初期化が完了したことを検知する必要があります。
そこでSKMapFragment#setMapSurfaceListenerを使うことで地図に関連するイベントを検知できるようになります。
上記のメソッドはSKMapSurfaceListenerを引数に取ります。
SKMapSurfaceListenerはたくさんのイベントを検知することができます、少しずつ説明しています。
SKMapSurfaceListener#onSurfaceCreatedはSKMapViewHolderの初期化が完成すると呼び出されます。
引数のSKMapViewHolderからSKMapSurfaceViewを取得することができます。
また、いくつか重要なことを列挙します。

  • 原則として複数の地図を同時に表示はできない。
  • SKMapViewHolder#onPauseとSKMapViewHolder#onResumeを必ず呼ぶ
  •     private SKMapSurfaceView mapView;
        private SKMapViewHolder mapHolder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            SKMapFragment mapFragment = new SKMapFragment();
            mapFragment.setMapSurfaceListener(this);
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.container, mapFragment).commit();
        }
    
        @Override
        public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) {
            mapHolder = skMapViewHolder;
            mapView = skMapViewHolder.getMapSurfaceView();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            if (mapHolder != null) {
                mapHolder.onPause();
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (mapHolder != null) {
                mapHolder.onResume();
            }
        }
    
    SKMapViewHolderを経由して縮尺を表示する方法のメモ。
        private void settingScaleView() {
            //縮尺の表示を有効にする。
            mapHolder.setScaleViewEnabled(true);
            //縮尺を右下に配置する。
            mapHolder.setScaleViewPosition(0, 80, RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.ALIGN_PARENT_BOTTOM);
            //SKMapScaleViewのインスタンスを取得する。
            SKMapScaleView scaleView = mapHolder.getScaleView();
            //枠線の色を指定する。
            scaleView.setBorderColor(Color.RED);
            //SKMapScaleViewのバーは明るい色と黒い色の二色で塗り分けられます。
            //暗い色を指定します。
            scaleView.setDarkerColor(Color.BLUE);
            //明るい色を指定します。
            scaleView.setLighterColor(Color.GREEN);
            //テキストの色を指定します。
            scaleView.setTextColor(Color.CYAN);
            //縮尺の単位を指定します。キロメーター、マイルフィート、マイルヤードから選択できます。
            scaleView.setDistanceUnit(SKMaps.SKDistanceUnitType.DISTANCE_UNIT_KILOMETER_METERS);
            //各単位のラベルを指定する。
            scaleView.setDistanceUnitLabels("kmのラベル", "mのラベル", "miのラベル", "ftのラベル","ydのラベル");
            //SKMapScaleViewの自動フェイドアウトアニメーションの有効無効を設定する。true:フェイドアウトする/false:フェイドアウトしない
            scaleView.setFadeOutEnabled(false);
        }
    
    今回はSKMapSurfaceViewとSKMapViewHolderについて説明しました。コードは下記のとおりです。
    public class MainActivity extends AppCompatActivity implements SKPrepareMapTextureListener, SKMapSurfaceListener {
        private SKCoordinate tokyo = new SKCoordinate(139.766084, 35.681382);
        private SKMapSurfaceView mapView;
        private SKMapViewHolder mapHolder;
        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 (mapHolder != null) {
                mapHolder.onPause();
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (mapHolder != null) {
                mapHolder.onResume();
            }
        }
    
        @Override
        public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) {
            mapHolder = skMapViewHolder;
            settingScaleView();
            mapView = skMapViewHolder.getMapSurfaceView();
            mapView.centerMapOnPosition(new SKCoordinate(139.766084, 35.681382));
            //initMapSettings();
        }
    
        private void settingScaleView() {
            //縮尺の表示を有効にする。
            mapHolder.setScaleViewEnabled(true);
            //縮尺を右下に配置する。
            mapHolder.setScaleViewPosition(0, 80, RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.ALIGN_PARENT_BOTTOM);
            //SKMapScaleViewのインスタンスを取得する。
            SKMapScaleView scaleView = mapHolder.getScaleView();
            //枠線の色を指定する。
            scaleView.setBorderColor(Color.RED);
            //SKMapScaleViewのバーは明るい色と黒い色の二色で塗り分けられます。
            //暗い色を指定します。
            scaleView.setDarkerColor(Color.BLUE);
            //明るい色を指定します。
            scaleView.setLighterColor(Color.GREEN);
            //テキストの色を指定します。
            scaleView.setTextColor(Color.CYAN);
            //縮尺の単位を指定します。キロメーター、マイルフィート、マイルヤードから選択できます。
            scaleView.setDistanceUnit(SKMaps.SKDistanceUnitType.DISTANCE_UNIT_KILOMETER_METERS);
            //各単位のラベルを指定する。
            scaleView.setDistanceUnitLabels("kmのラベル", "mのラベル", "miのラベル", "ftのラベル","ydのラベル");
            //SKMapScaleViewの自動フェイドアウトアニメーションの有効無効を設定する。true:フェイドアウトする/false:フェイドアウトしない
            scaleView.setFadeOutEnabled(false);
        }
    
        @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) {}
    
        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);
        }
    }
    

    Androidゲームプログラミング A to Z

    新品価格
    ¥4,968から
    (2017/2/27 22:58時点)


    AndroidエンジニアのためのモダンJava

    新品価格
    ¥3,456から
    (2017/2/27 23:01時点)


    AndroidNDKネイティブプログラミング第2版

    中古価格
    ¥1,893から
    (2017/2/28 00:04時点)


    Androidアプリ開発逆引きレシピ (PROGRAMMER’S RECiPE)

    新品価格
    ¥3,024から
    (2017/2/28 00:06時点)


    Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

    新品価格
    ¥3,240から
    (2017/2/28 00:11時点)


    アプリを作ろう! Android入門 Android Studio版 Android5対応

    新品価格
    ¥2,160から
    (2017/2/28 00:31時点)


    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    *

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)