【AndroidでSkobblerを使う】SKMapSurfaceListenerを使ってタッチイベントを拾う

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

「地図をタップしたときになにかしたい」や「地図を移動させたときになにかしたい」などの地図上で起こるイベントを検知するSKMapSurfaceListenerについてのメモ
今回は特は地図に触れたときのイベントを紹介します。

    @Override
    public void onActionPan() {
        //移動したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onActionPan");
    }

    @Override
    public void onActionZoom() {
        //ズームしたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onActionZoom");
    }

    @Override
    public void onRotateMap() {
        //回転したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onRotateMap");
    }

    @Override
    public void onMapActionDown(SKScreenPoint skScreenPoint) {
        //マップに指が触れたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onMapActionDown");
        Log.d("SKMapSurfaceListener", "onMapActionDown[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onMapActionUp(SKScreenPoint skScreenPoint) {
        //マップから指から離れたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onMapActionUp");
        Log.d("SKMapSurfaceListener", "onMapActionUp[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onSingleTap(SKScreenPoint skScreenPoint) {
        //タップ(ActionDown-ActionUp)したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onSingleTap");
        Log.d("SKMapSurfaceListener", "onSingleTap[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onDoubleTap(SKScreenPoint skScreenPoint) {
        //ダブルタップ(ActionDown-ActionUp-ActionDown-ActionUp)したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onDoubleTap");
        Log.d("SKMapSurfaceListener", "onDoubleTap[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onLongPress(SKScreenPoint skScreenPoint) {
        //長押ししたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onLongPress");
        Log.d("SKMapSurfaceListener", "onLongPress[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }
SKScreenPointはスクリーン上での位置を表しているクラスです。緯度経度ではないことに注意してください。
今回のコードの全量です。
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);
        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;
        mapView = skMapViewHolder.getMapSurfaceView();
        mapView.centerMapOnPosition(new SKCoordinate(139.766084, 35.681382));
        //initMapSettings();
        //settingScaleView();
    }

    @Override
    public void onActionPan() {
        //移動したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onActionPan");
    }

    @Override
    public void onActionZoom() {
        //ズームしたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onActionZoom");
    }

    @Override
    public void onRotateMap() {
        //回転したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onRotateMap");
    }

    @Override
    public void onMapActionDown(SKScreenPoint skScreenPoint) {
        //マップに指が触れたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onMapActionDown");
        Log.d("SKMapSurfaceListener", "onMapActionDown[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onMapActionUp(SKScreenPoint skScreenPoint) {
        //マップから指から離れたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onMapActionUp");
        Log.d("SKMapSurfaceListener", "onMapActionUp[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onSingleTap(SKScreenPoint skScreenPoint) {
        //タップ(ActionDown-ActionUp)したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onSingleTap");
        Log.d("SKMapSurfaceListener", "onSingleTap[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onDoubleTap(SKScreenPoint skScreenPoint) {
        //ダブルタップ(ActionDown-ActionUp-ActionDown-ActionUp)したときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onDoubleTap");
        Log.d("SKMapSurfaceListener", "onDoubleTap[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onLongPress(SKScreenPoint skScreenPoint) {
        //長押ししたときに呼ばれる。
        Log.d("SKMapSurfaceListener", "onLongPress");
        Log.d("SKMapSurfaceListener", "onLongPress[x:" + skScreenPoint.getX() + "/y:" + skScreenPoint.getY()+"]");
    }

    @Override
    public void onMapRegionChanged(SKCoordinateRegion skCoordinateRegion) {}

    @Override
    public void onMapRegionChangeStarted(SKCoordinateRegion skCoordinateRegion) {}

    @Override
    public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {}

    @Override
    public void onInternetConnectionNeeded() {}

    @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);
    }

    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);
    }
}

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時点)


コメントを残す

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

*

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