百度地圖之覆蓋物
阿新 • • 發佈:2019-02-11
今天熟悉了一下百度地圖有關覆蓋物的知識,首先,大家來看一下做出來的效果:
我們來看程式碼
一、佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/clear_overlay"
android:layout_width="0dp"
android:layout_height ="wrap_content"
android:layout_weight="1"
android:text="清空資料" />
<Button
android:id="@+id/reset_overlay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text ="重置" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<SeekBar
android:id="@+id/seekbar_overlay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<CheckBox
android:id="@+id/checkbox_overlay"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="Mark新增動畫" />
</LinearLayout>
<com.baidu.mapapi.map.MapView
android:id="@+id/mapView_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</LinearLayout>
二、我們來看一下在onCreate()方法裡呼叫的方法,先大致形成一個思路
@Bind(R.id.clear_overlay)
Button clear_overlay;
@Bind(R.id.reset_overlay)
Button reset_overlay;
@Bind(R.id.seekbar_overlay)
SeekBar seekbar_overlay;
@Bind(R.id.checkbox_overlay)
CheckBox checkbox_overlay;
@Bind(R.id.mapView_overlay)
MapView mapView_overlay;
private BaiduMap baidumap;
private Marker mMarkerA;
private Marker mMarkerB;
private Marker mMarkerC;
private Marker mMarkerD;
BitmapDescriptor bdA;
BitmapDescriptor bdB;
BitmapDescriptor bdC;
BitmapDescriptor bdD;
BitmapDescriptor db;
BitmapDescriptor bdGround;
private InfoWindow infoWindow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_baidu_over);
ButterKnife.bind(this);
initView();//控制元件的初始化
initBitmapDescriptor();//初始化全域性bitmap的資訊
initOverlay(); //覆蓋物的初始化
setBaiduMarkListener();//設定當點選覆蓋物時做的操作
}
三、initView()方法,實現控制元件的初始化
public void initView() {
baidumap = mapView_overlay.getMap();
MapStatusUpdate mapStatus = MapStatusUpdateFactory.zoomTo(14.0f);
baidumap.setMapStatus(mapStatus);
seekbar_overlay.setOnSeekBarChangeListener(new SeekBarListner());
clear_overlay.setOnClickListener(this);
reset_overlay.setOnClickListener(this);
}
四、initBitmapDescriptor()方法,初始化全域性bitmap(標註物)的資訊
//初始化全域性bitmap的資訊,及時recycle
public void initBitmapDescriptor() {
bdA = BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka);
bdB = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markb);
bdC = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markc);
bdD = BitmapDescriptorFactory.fromResource(R.mipmap.icon_markd);
bdGround = BitmapDescriptorFactory.fromResource(R.mipmap.ground_overlay);
db = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
}
五、initOverlay() 方法,初始化覆蓋物的位置資訊,設定覆蓋物的移動監聽OnMarkerDragListener();
//覆蓋物的初始化
public void initOverlay() {
LatLng llA = new LatLng(39.963175, 116.400244);
LatLng llB = new LatLng(39.942821, 116.369199);
LatLng llC = new LatLng(39.939723, 116.425541);
LatLng llD = new LatLng(39.906965, 116.401394);
MarkerOptions ooA = new MarkerOptions()
.position(llA).//設定覆蓋物的位置座標
icon(bdA).//設定Marker覆蓋物的圖示
zIndex(9).
draggable(true);//覆蓋物是否可以拖拽
if (checkbox_overlay.isChecked()) {
//呼叫動畫
ooA.animateType(MarkerOptions.MarkerAnimateType.drop);
}
mMarkerA = (Marker) (baidumap.addOverlay(ooA));
MarkerOptions ooB = new MarkerOptions().position(llB).icon(bdB).zIndex(5);
if (checkbox_overlay.isChecked()) {
ooB.animateType(MarkerOptions.MarkerAnimateType.drop);
}
mMarkerB = (Marker) baidumap.addOverlay(ooB);
MarkerOptions ooC = new MarkerOptions().position(llC).icon(bdC)
.perspective(false)//設定是否開啟 Marker 覆蓋物近大遠小效果,預設開啟
.anchor(0.5f, 0.5f)//設定 Marker 覆蓋物的錨點比例,預設(0.5f, 1.0f)水平居中,垂直下對齊
.rotate(30)//設定旋轉角度
.zIndex(7);
if (checkbox_overlay.isChecked()) {
ooC.animateType(MarkerOptions.MarkerAnimateType.grow);
}
mMarkerC = (Marker) baidumap.addOverlay(ooC);
ArrayList<BitmapDescriptor> list = new ArrayList<>();
list.add(bdA);
list.add(bdB);
list.add(bdC);
MarkerOptions ooD = new MarkerOptions().position(llD).icons(list)
.zIndex(0).period(10);
if (checkbox_overlay.isChecked()) {
// 生長動畫
ooD.animateType(MarkerOptions.MarkerAnimateType.grow);
}
mMarkerD = (Marker) (baidumap.addOverlay(ooD));
//增加周圍的覆蓋物
LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);
LatLngBounds bounds = new LatLngBounds.Builder().include(southwest).include(northeast).build();
OverlayOptions ooGround = new GroundOverlayOptions()
.positionFromBounds(bounds).image(bdGround).transparency(0.8f);
baidumap.addOverlay(ooGround);
//MapStatusUpdate描述地圖狀態將要發生的變化
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(bounds.getCenter());
baidumap.setMapStatus(u);
baidumap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
@Override
public void onMarkerDrag(Marker marker) {
}
@Override
public void onMarkerDragEnd(Marker marker) {
Toast.makeText(
BaiduOverActivity.this,
"拖拽結束,新位置:" + marker.getPosition().latitude + ", "
+ marker.getPosition().longitude,
Toast.LENGTH_LONG).show();
}
@Override
public void onMarkerDragStart(Marker marker) {
}
});
}
六、setBaiduMarkListener() 方法,當點選覆蓋物的時候定義相應的動作
/***
* 設定當點選覆蓋物時做的操作
**/
public void setBaiduMarkListener() {
baidumap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(final Marker marker) {
//動態建立button
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.mipmap.ground_overlay);
InfoWindow.OnInfoWindowClickListener listener = null;
if (marker == mMarkerA || marker == mMarkerD) {
button.setText("更改位置");
listener = new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
LatLng ll = marker.getPosition();
LatLng llNew = new LatLng(ll.latitude + 0.005,
ll.longitude + 0.005);
marker.setPosition(llNew);
baidumap.hideInfoWindow();
}
};
LatLng lat = marker.getPosition();
infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
baidumap.showInfoWindow(infoWindow);
} else if (marker == mMarkerB) {
button.setText("更改圖示");
listener = new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
marker.setIcon(db);
baidumap.hideInfoWindow();
}
};
LatLng lat = marker.getPosition();
infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
baidumap.showInfoWindow(infoWindow);
} else if (marker == mMarkerC) {
button.setText("刪除");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
marker.remove();
baidumap.hideInfoWindow();
}
});
}
LatLng lat = marker.getPosition();
infoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), lat, -47, listener);
baidumap.showInfoWindow(infoWindow);
return true;
}
});
}
七、當點選清空和重置按鈕時,產生的操作
/**
* 清空所有的overlay
**/
public void clearAllOverlay() {
baidumap.clear();
mMarkerA = null;
mMarkerB = null;
mMarkerC = null;
mMarkerD = null;
}
/***
* 重置Overlay
**/
public void resetOverlay() {
clearAllOverlay();
initOverlay();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.clear_overlay:
clearAllOverlay();
break;
case R.id.reset_overlay:
resetOverlay();
break;
}
}
八、滑動seekBar,控制覆蓋物的顯示透明度
// 設定seekbar的監聽
private class SeekBarListner implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
float alph = ((float) seekBar.getProgress()) / 10;
if (mMarkerA != null) {
mMarkerA.setAlpha(alph);
}
if (mMarkerB != null) {
mMarkerB.setAlpha(alph);
}
if (mMarkerC != null) {
mMarkerC.setAlpha(alph);
}
if (mMarkerD != null) {
mMarkerD.setAlpha(alph);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
程式碼到這裡,基本就結束了。