[android] GoogleMapSDKを使ってMAP実装

目次

GoogleMapSDKを使ってMAP実装

以下の機能を実装

・Pinを好きな画像にカスタマイズ
・シークバーで中心からの円の半径を変更→同時にGoogleMAPの円の描画も変更
・MAPをタップすると円とアイコンがタップした位置に変更→カメラもアニメーションで移動
・テキスト表示する半径は3桁区切りでmで表示
・シークバーの最小値を10m、最大値2000mに設定
・color.xmlに円の塗りつぶしと線のカラーを登録、resourceからアクセス

MainActivity.java

    private SeekBar sb0;
    private TextView tv0;

    private GoogleMap mMap;
    private int minRange;
    private int radius;
    private Bitmap makerImage;
    private LatLng location;
    private Circle circle;
    private CircleOptions circleOptions;
    private float zoom;
    private Resources res;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sb0 = (SeekBar)findViewById(R.id.seek);
        tv0 = (TextView)findViewById(R.id.textView);
        minRange = 10;
        location = new LatLng(-34, 151);
        zoom = 14;
        res = getResources();

        //GoogleMap設定
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.mapFragment);
        mapFragment.getMapAsync(this);


        //SeekBar設定
        _changedTextRange(_changedTextRange(sb0.getProgress())); //初期値設定

        sb0.setOnSeekBarChangeListener(
                new SeekBar.OnSeekBarChangeListener() {
                    public void onProgressChanged(SeekBar seekBar,
                                                  int progress, boolean fromUser) {
                        // ツマミをドラッグしたときに呼ばれる
                        _changedTextRange(sb0.getProgress());
                        circle.setRadius(sb0.getProgress());

                    }

                    public void onStartTrackingTouch(SeekBar seekBar) {
                        // ツマミに触れたときに呼ばれる
                    }

                    public void onStopTrackingTouch(SeekBar seekBar) {
                        // ツマミを離したときに呼ばれる
                    }
                }
        );

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override
            public void onMapClick(LatLng point) {
                location = point;
                _googleMapRemark(); //pinとCircleを再描画
                mMap.animateCamera(CameraUpdateFactory.newLatLng(point)); //アニメーションしながらカメラをタップ位置に移動
            }
        });


        makerImage = BitmapFactory.decodeResource(getResources(),R.drawable.pinImage); //pinをpinImageという画像でカスタマイズ
        mMap.moveCamera( CameraUpdateFactory.newLatLngZoom(location ,zoom) );
        _googleMapMarkerCreate();
        _googleMapCircleCreate();
    }

    private void _googleMapCircleCreate(){
        final int version = Build.VERSION.SDK_INT;

        //API23からres.getColorは非推奨
        if (version >= 23) {
            circleOptions = new CircleOptions()
                    .center(location)
                    .radius(radius)
                    .fillColor(getColor(R.color.kBaseColorCircle))
                    .strokeColor(getColor(R.color.kBaseColor));
        } else {
            circleOptions = new CircleOptions()
                    .center(location)
                    .radius(radius)
                    .fillColor(res.getColor(R.color.kBaseColorCircle))
                    .strokeColor(res.getColor(R.color.kBaseColor));
        }

        circle = mMap.addCircle(circleOptions);
    }

    private void _googleMapMarkerCreate(){
        Marker melbourne = mMap.addMarker(new MarkerOptions()
                .position(location)
                .icon(BitmapDescriptorFactory.fromBitmap(makerImage)));
    }

    private void _googleMapRemark(){
        mMap.clear();
        _googleMapMarkerCreate();
        _googleMapCircleCreate();
    }
    private void _changedTextRange(int range){
        tv0.setText(String.format("%1$,3dm", range));
    }

    private int _adjustRange(int range){
        return range+minRange;
    }

activity_main.xml




    

    

        
        

*シークバーの初期値「android:progress」と最大値「android:max」は最小値を10にするために10引いている
*シークバーの最小値は0以外設定できないため、表示を+10としているため

コメントを残す

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