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