1. 程式人生 > >百度地圖3.1.1開發簡略之地圖閃爍圖示

百度地圖3.1.1開發簡略之地圖閃爍圖示

package com.pcitc.sinomap;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapLoadedCallback;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;

/**
* 演示覆蓋物的用法
*/
public class MainActivity extends Activity implements OnClickListener{

/**
* MapView 是地圖主控制元件
*/
private MapView mMapView;
private BaiduMap mBaiduMap;
//在地圖中顯示一個資訊視窗,可以設定一個View作為該視窗的內容,也可以設定一個 BitmapDescriptor 作為該視窗的內容。
private InfoWindow mInfoWindow;

//這三個就是地圖上的小圖示背景,是兩種顏色同等大小的圖片,一紅一綠,他們兩個互動顯示就是閃爍的效果。不用時及時 recycle
BitmapDescriptor icBig = BitmapDescriptorFactory.fromResource(R.drawable.b_green);
BitmapDescriptor icSmall = BitmapDescriptorFactory.fromResource(R.drawable.b_red);

String[] loca;
String who = "test";
Map<String,Integer> map = new HashMap<String,Integer>();

Timer timer;
int blinked ;
public static final int DISPALY_TIME = 1200;
public static final int BLINK_INTERVAL = 600;
public static final int BLINK_DELAY = 1000;
public static final int ZOOM_SIZE = 14;

double baseLat = 39.963175;
double baseLong = 116.400244;
MarkerOptions marker,marker2;
Marker mk;

Button customerBtn,watchBtn;

boolean customerMode =true;
int zindex;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

customerBtn = (Button) findViewById(R.id.customer);
watchBtn = (Button) findViewById(R.id.watch);

customerBtn.setOnClickListener(this);
watchBtn.setOnClickListener(this);

mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);//設定地圖的縮放級別
mBaiduMap.setMapStatus(msu);//

//新增地圖載入監聽器 ,
mBaiduMap.setOnMapLoadedCallback(new OnMapLoadedCallback() {

@Override
public void onMapLoaded() {
//地圖載入完,重新整理小圖示
timer = new Timer();
startBlink(getLatLng(baseLat+"",baseLong+""));
setMapCenter(getLatLng(baseLat+"",baseLong+""));
}
});

mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
public boolean onMarkerClick(final Marker marker) {
Button button = new Button(getApplicationContext());//新建一個按鈕,這個就是點選小圖示後顯示的view
button.setBackgroundResource(R.drawable.popup);//給按鈕設定背景
OnInfoWindowClickListener listener = null;
String all = marker.getTitle();
String name = who;
button.setText(name);//設定點選後顯示的文字
button.setTextColor(getResources().getColor(R.color.black));
listener = new OnInfoWindowClickListener() {
public void onInfoWindowClick() {
LatLng ll = marker.getPosition();
// LatLng llNew = new LatLng(ll.latitude + 0.005,ll.longitude + 0.005);
marker.setPosition(ll);
//當前的圖示隱藏掉(這個隱藏是全隱藏掉,沒有找到只隱藏掉文字的直接方法,通過先隱藏再顯示間接隱藏了文字)
mBaiduMap.hideInfoWindow();
}
};
LatLng ll = marker.getPosition();
//InfoWindow 構造引數
//view - InfoWindow 展示的 view
//position - InfoWindow 顯示的地理位置
//yOffset - InfoWindow Y 軸偏移量
//listener - InfoWindow 點選監聽者
mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), ll, -47, listener);
mBaiduMap.showInfoWindow(mInfoWindow);
return true;
}
});

findViewById(R.id.back).setOnClickListener(this);
}

public void startBlink(LatLng mlatlng){
marker = new MarkerOptions().position(mlatlng).icon(icBig).zIndex(zindex++);//設定zindex是為圖示設定一個id,為以後獲取他
marker.title(who);

timer.schedule(new TimerTask(){

@Override
public void run() {
if(blinked >DISPALY_TIME){
timer.cancel();
mk.remove();//小圖示移除
}else{
if(blinked <=0){
mk = (Marker) mBaiduMap.addOverlay(marker);
}else{
if(blinked % 2 == 1){
mk.setIcon(icSmall);
}else{
mk.setIcon(icBig);
}
}
blinked++;
}

}}, BLINK_DELAY,BLINK_INTERVAL);


}

public LatLng getLatLng(String latitude,String longtitude){

LatLng llA = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longtitude));
return llA;

}


public void freshMap(String lat,String lon,String who){
startBlink(getLatLng(lat,lon));
if(customerMode){
setMapCenter(getLatLng(lat,lon));
}
}

public void setMapCenter(LatLng ll){
MapStatus mMapStatus = new MapStatus.Builder().target(ll).zoom(ZOOM_SIZE).build();
//定義MapStatusUpdate物件,以便描述地圖狀態將要發生的變化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改變地圖狀態
mBaiduMap.setMapStatus(mMapStatusUpdate);
}

/**
* 清除所有Overlay
*
* @param view
*/
public void clearOverlay(View view) {
mBaiduMap.clear();
}

/**
* 重新新增Overlay
*
* @param view
*/
public void resetOverlay(View view) {
clearOverlay(null);

}

@Override
protected void onPause() {
// MapView的生命週期與Activity同步,當activity掛起時需呼叫MapView.onPause()
mMapView.onPause();
super.onPause();
}

@Override
protected void onResume() {
// MapView的生命週期與Activity同步,當activity恢復時需呼叫MapView.onResume()
mMapView.onResume();
super.onResume();
}

@Override
protected void onDestroy() {
// MapView的生命週期與Activity同步,當activity銷燬時需呼叫MapView.destroy()
super.onDestroy();
mMapView.onDestroy();
icBig.recycle();
icSmall.recycle();
}

@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.back:
finish();
timer.cancel();
break;
}
}

}