[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としているため