微信扫一扫

028-83195727 , 15928970361
business@forhy.com

浅谈百度地图的简单开发之实现基本地图的类型及覆盖物的添加(二)

高仿百度地图,Android2016-05-27

     今天,我们接着上一讲,上一讲我们把地图上界面自定义了一番,加上了按钮等一系列的控件,但是还没有给这些加上具体的功能,今天这一讲,主要是实现几种地图的切换,是否开启实时交通,通过自定义的按钮去控制地图的缩放,以及在地图上添加覆盖物及相关显示覆盖物的信息。

   一、先给路况那个控件添加实时路况开关的功能,这个功能比较简单,就是通过一个API中的方法isTrafficEnabled()来判断是不是已经处于实时交通的打开状态,如果已经是打开了,当点击后就应该关闭。

	/**
	 * @author mikyou
	 * 是否打开实时交通
	 * */
	private void switchRoadCondition() {
		if (myBaiduMap.isTrafficEnabled()) {//如果是开着的状态,当点击后,就会出关闭状态
			myBaiduMap.setTrafficEnabled(false);
			mapRoad.setImageResource(R.drawable.main_icon_roadcondition_off);
		}else{//如果是的关闭的状态,当点击后,就会处于开启的状态
			myBaiduMap.setTrafficEnabled(true);
			mapRoad.setImageResource(R.drawable.main_icon_roadcondition_on);
		}
	}


二、然后接着就是添加选择地图类型的功能,这里提供了3种类型的地图分别是:普通地图、卫星地图、热力地图。我是通过弹出一个选择的对话框来供用户选择不同类型的地图。

/**
	 * @author mikyou
	 * 选择地图的类型
	 * */
	private void selectMapType() {
		AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
		builder.setIcon(R.drawable.icon)
		.setTitle("请选择地图的类型")
		.setItems(types, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				String select=types[which];
				if (select.equals("普通地图")) {
					myBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
				}else if (select.equals("卫星地图")) {
					myBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
				}else if (select.equals("热力地图(已关闭)")||select.equals("热力地图(已打开)")) {
					if(myBaiduMap.isBaiduHeatMapEnabled()) {
						myBaiduMap.setBaiduHeatMapEnabled(false);
						Toast.makeText(MainActivity.this, "热力地图已关闭", 0).show();
						types[which]="热力地图(已关闭)";
					}else {
						myBaiduMap.setBaiduHeatMapEnabled(true);
						Toast.makeText(MainActivity.this, "热力地图已打开", 0).show();
						types[which]="热力地图(已打开)";
					}
				}
			}
		}).show();
	}

三、给控制地图比例放大缩小控件加上,放大和缩小的功能。具体实现是这样的,设置一个全局的变量来表示实时的比例,然后通过点击放大和缩小的控件,来控制这个变量增加和减少,并实时将这个变量设置给创建地图状态对象的参数,从而实现实时控制放大和缩小地图。

	/**
	 * @author zhongqihong
	 * 放大地图的比例
	 * */
	private void narrowMapScale() {
		current-=0.5f;
		MapStatusUpdate msu=MapStatusUpdateFactory.zoomTo(15.0f+current);
		myBaiduMap.animateMapStatus(msu);
	}
	/**
	 *@author zhongqihong
	 *缩小地图的比例 
	 * */
	private void expandMapScale() {
		current+=0.5f;
		MapStatusUpdate msu2=MapStatusUpdateFactory.zoomTo(15.0f+current);
		myBaiduMap.animateMapStatus(msu2);
	}

四、接着就是在地图添加覆盖物,并且给该覆盖物添加点击事件,点击后并且在底部显示出一个介绍该地点的图文介绍信息,和一个InfoWindow(该InfoWindow上显示着该地点的名称)。主要实现的思路是这样的,我们首先得创建一个bean来保存每一个覆盖物的详细信息。包括该覆盖物的经纬度,图片路径,覆盖物的名称等;实际这也就是相当于ListVIew中的每个Item的信息,而显示覆盖物信息只是分散的Item而已,每个覆盖物详细信息项都一样。所以写一个Bean可以更好地管理数据。我们有很多个覆盖物,那么可以创建一个bean类型的List集合存放着不同覆盖物对象,不同覆盖物处于地图中不同的位置,可以根据不同Bean中经纬度值构成的经纬度对象不同,只要拿到了经纬度对象,那么就可以在地图上唯一确定这个点,并且在这个点会显示一个自定义的图标。

	/**
	 * @author mikyou
	 * 初始化覆盖物信息数据
	 * */
	private void initMarksData() {
		markInfoList=new ArrayList<MarkInfo>();
		markInfoList.add(new MarkInfo(32.079254, 118.787623, R.drawable.pic1, "英伦贵族小旅馆", "距离209米", 1888));
		markInfoList.add(new MarkInfo(32.064355, 118.787624, R.drawable.pic2, "沙井国际高级会所", "距离459米", 388));
		markInfoList.add(new MarkInfo(28.7487420000, 115.8748860000, R.drawable.pic4, "华东交通大学南区", "距离5米", 888));
		markInfoList.add(new MarkInfo(28.7534890000, 115.8767960000, R.drawable.pic3, "华东交通大学北区", "距离10米", 188));
	   myBaiduMap.setOnMarkerClickListener(this);
	   myBaiduMap.setOnMapClickListener(this);   
	}
	/**
	 * @author Mikyou
	 * 添加覆盖物
	 * */
	private void addMapMarks() {
		initMarksData();
		myBaiduMap.clear();//先清除一下图层
		LatLng latLng=null;
		Marker marker=null;
		OverlayOptions options;
		myMarks=BitmapDescriptorFactory.fromResource(R.drawable.mark);//引入自定义的覆盖物图标,将其转化成一个BitmapDescriptor对象
		//遍历MarkInfo的List一个MarkInfo就是一个Mark
		for (int i = 0; i < markInfoList.size(); i++) {
			//经纬度对象
			latLng=new LatLng(markInfoList.get(i).getLatitude(), markInfoList.get(i).getLongitude());//需要创建一个经纬对象,通过该对象就可以定位到处于地图上的某个具体点
			//图标
			options=new MarkerOptions().position(latLng).icon(myMarks).zIndex(6);
			marker=(Marker) myBaiduMap.addOverlay(options);//将覆盖物添加到地图上
			Bundle bundle=new Bundle();//创建一个Bundle对象将每个mark具体信息传过去,当点击该覆盖物图标的时候就会显示该覆盖物的详细信息
			bundle.putSerializable("mark", markInfoList.get(i));
			marker.setExtraInfo(bundle);
		}
		MapStatusUpdate msu=MapStatusUpdateFactory.newLatLng(latLng);//通过这个经纬度对象,地图就可以定位到该点
		myBaiduMap.animateMapStatus(msu);
	}

五、加上点击覆盖物的事件使得InfoWindow和底部的图文信息显示出来,原来底部图文信息是不显示的,当点击该覆盖物后,就会得到从上一步传来的一个Bundle对象,该Bundle对象实际上包括的就是当前被点击的覆盖物的Bean中所存的信息,然后可以通过Bean信息来更新底部图文信息UI布局(类似于ListView中的GetView方法),并给该布局设置是可见的。但是当我点击地图其他部分就必须隐藏该底部的图文信息,所以还得给该整个地图设置点击事件,当点击地图后,图文信息再次被隐藏。还有一个InfoWindow,InfoWindow就是指向当前覆盖物的介绍信息。所以它也需要Bean中信息,所以它也得获取Bundle对象,然后设置信息。当点击地图时它也需要被再次隐藏。

package com.mikyou.beans;

import java.io.Serializable;

public class MarkInfo implements Serializable{
	private double latitude;
	private double longitude;
	private int ImageId;
	private String name;
	private String distance;
	private int zanNum;
	public MarkInfo(double latitude, double longitude, int imageId,
			String name, String distance, int zanNum) {
		super();
		this.latitude = latitude;
		this.longitude = longitude;
		ImageId = imageId;
		this.name = name;
		this.distance = distance;
		this.zanNum = zanNum;
	}
	public MarkInfo() {
		super();
	}
	public double getLatitude() {
		return latitude;
	}
	public void setLatitude(double latitude) {
		this.latitude = latitude;
	}
	public double getLongitude() {
		return longitude;
	}
	public void setLongitude(double longitude) {
		this.longitude = longitude;
	}
	public int getImageId() {
		return ImageId;
	}
	public void setImageId(int imageId) {
		ImageId = imageId;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDistance() {
		return distance;
	}
	public void setDistance(String distance) {
		this.distance = distance;
	}
	public int getZanNum() {
		return zanNum;
	}
	public void setZanNum(int zanNum) {
		this.zanNum = zanNum;
	}

}


 

	/**
	 * @author mikyou
	 * 覆盖物的点击事件
	 * */
	@Override
	public boolean onMarkerClick(Marker marker) {
		Bundle bundle=  marker.getExtraInfo();
		MarkInfo MyMarker=(MarkInfo) bundle.getSerializable("mark");
		ImageView iv=(ImageView) markLayout.findViewById(R.id.mark_image);
		TextView distanceTv=(TextView) markLayout.findViewById(R.id.distance);
		TextView nameTv=(TextView) markLayout.findViewById(R.id.name);
		TextView zanNumsTv=(TextView) markLayout.findViewById(R.id.zan_nums);
		iv.setImageResource(MyMarker.getImageId());
		distanceTv.setText(MyMarker.getDistance()+"");
		nameTv.setText(MyMarker.getName());
		zanNumsTv.setText(MyMarker.getZanNum()+"");
		//初始化一个InfoWindow
		initInfoWindow(MyMarker,marker);
		markLayout.setVisibility(View.VISIBLE);
		return true;
	}
	/**
	 *@author mikyou
	 *初始化出一个InfoWindow
	 * 
	 * */
	private void initInfoWindow(MarkInfo MyMarker,Marker marker) {
		// TODO Auto-generated method stub
		InfoWindow infoWindow;
		//InfoWindow中显示的View内容样式,显示一个TextView
		TextView infoWindowTv=new TextView(MainActivity.this);
		infoWindowTv.setBackgroundResource(R.drawable.location_tips);
		infoWindowTv.setPadding(30, 20, 30, 50);
		infoWindowTv.setText(MyMarker.getName());
		infoWindowTv.setTextColor(Color.parseColor("#FFFFFF"));

		final LatLng latLng=marker.getPosition();
		Point p=myBaiduMap.getProjection().toScreenLocation(latLng);//将地图上的经纬度转换成屏幕中实际的点
		p.y-=47;//设置屏幕中点的Y轴坐标的偏移量
		LatLng ll=myBaiduMap.getProjection().fromScreenLocation(p);//把修改后的屏幕的点有转换成地图上的经纬度对象
		/**
		 * @author mikyou
		 * 实例化一个InfoWindow的对象
		 * public InfoWindow(View view,LatLng position, int yOffset)通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中,监听事件由开发者实现。
		 *	参数:
		 * view - InfoWindow 展示的 view
		 * position - InfoWindow 显示的地理位置
		 * yOffset - InfoWindow Y 轴偏移量
		 * */
		infoWindow=new InfoWindow(infoWindowTv, ll, 10);
		myBaiduMap.showInfoWindow(infoWindow);//显示InfoWindow
	}
	/**
	 * @author zhongqihong
	 * 给整个地图添加的点击事件
	 * */
	@Override
	public void onMapClick(LatLng arg0) {//表示点击地图其他的地方使得覆盖物的详情介绍的布局隐藏,但是点击已显示的覆盖物详情布局上,则不会消失,因为在详情布局上添加了Clickable=true
		//由于事件的传播机制,因为点击事件首先会在覆盖物布局的父布局(map)中,由于map是可以点击的,map则会把点击事件给消费掉,如果加上Clickable=true表示点击事件由详情布局自己处理,不由map来消费
		markLayout.setVisibility(View.GONE);
		myBaiduMap.hideInfoWindow();//隐藏InfoWindow
	}
	@Override
	public boolean onMapPoiClick(MapPoi arg0) {
		return false;
	}


 

六、最后贴出该MainActivity源码:

package com.mikyou.maptest;

import java.util.ArrayList;
import java.util.List;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
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.MapPoi;
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.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.mikyou.beans.MarkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ZoomControls;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Point;

public class MainActivity extends Activity implements OnClickListener,OnMapClickListener,OnMarkerClickListener{
	private MapView mapView=null;
	private BaiduMap myBaiduMap=null;
	//修改默认View相关
	private View defaultBaiduMapScaleButton,defaultBaiduMapLogo,defaultBaiduMapScaleUnit;
	//基本地图类型,实时交通,及覆盖物相关
	private ImageView mapRoad;
	private ImageView mapType;
	private String[] types={"普通地图","卫星地图","热力地图(已关闭)"};
	private float current;//放大或缩小的比例系数
	private ImageView expandMap;//放大地图控件
	private ImageView narrowMap;//缩小地图
	private ImageView addMarks;//添加覆盖物控件
	private BitmapDescriptor myMarks;
	private List<MarkInfo> markInfoList;
	private LinearLayout markLayout;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.activity_main);
		mapView=(MapView) findViewById(R.id.map_view_test);
		initMapView();
		changeDefaultBaiduMapView();
	}
	/**
	 * @author zhongqihong
	 * 初始化地图的View
	 * */
	private void initMapView() {
		registerAllIds();
		registerAllEvents();
	}
	private void registerAllIds() {
		mapRoad=(ImageView) findViewById(R.id.road_condition);
		mapType=(ImageView) findViewById(R.id.map_type);
		expandMap=(ImageView) findViewById(R.id.add_scale);
		narrowMap=(ImageView) findViewById(R.id.low_scale);
		addMarks=(ImageView) findViewById(R.id.map_marker);
		markLayout=(LinearLayout) findViewById(R.id.mark_layout);
	}
	private void registerAllEvents() {
		mapRoad.setOnClickListener(this);
		mapType.setOnClickListener(this);
		expandMap.setOnClickListener(this);
		narrowMap.setOnClickListener(this);
		addMarks.setOnClickListener(this);
	}
	/**
	 * @author zhongqihong
	 * 除去百度地图上的默认控件
	 * */
	private void changeDefaultBaiduMapView() {
		changeInitialzeScaleView();//改变默认百度地图初始加载的地图比例
		//设置隐藏缩放和扩大的百度地图的默认的比例按钮
		for (int i = 0; i < mapView.getChildCount(); i++) {//遍历百度地图中的所有子View,找到这个扩大和缩放的按钮控件View,然后设置隐藏View即可
			View child=mapView.getChildAt(i);
			if (child instanceof ZoomControls) {
				defaultBaiduMapScaleButton=child;//该defaultBaiduMapScaleButton子View是指百度地图默认产生的放大和缩小的按钮,得到这个View
				break;
			}
		}
		defaultBaiduMapScaleButton.setVisibility(View.GONE);//然后将该View的Visiblity设为不存在和不可见,即隐藏
		defaultBaiduMapLogo =mapView.getChildAt(1);//该View是指百度地图中默认的百度地图的Logo,得到这个View
		defaultBaiduMapLogo.setPadding(300, -10, 100, 100);//设置该默认Logo View的位置,因为这个该View的位置会影响下面的刻度尺单位View显示的位置
		mapView.removeViewAt(1);//最后移除默认百度地图的logo View
		defaultBaiduMapScaleUnit=mapView.getChildAt(2);//得到百度地图的默认单位刻度的View
		defaultBaiduMapScaleUnit.setPadding(100, 0, 115,200);//最后设置调整百度地图的默认单位刻度View的位置		
	}
	/**
	 * @author zhongqihong
	 * 改变默认初始化的地图的比例
	 * */
	private void changeInitialzeScaleView() {
		myBaiduMap=mapView.getMap();//改变百度地图的放大比例,让首次加载地图就开始扩大到500米的距离,获得百度地图对象
		MapStatusUpdate factory=MapStatusUpdateFactory.zoomTo(15.0f);
		myBaiduMap.animateMapStatus(factory);		
	}
	/**
	 * @author zhongqihong
	 * 管理地图的生命周期
	 * */
	@Override
	protected void onPause() {
		mapView.onPause();
		super.onPause();
	}
	@Override
	protected void onResume() {
		mapView.onResume();
		super.onResume();
	}
	@Override
	protected void onDestroy() {
		mapView.onDestroy();
		super.onDestroy();
	}
	//点击事件相关
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.road_condition://是否打开实时交通
			switchRoadCondition();
			break;
		case R.id.map_type://选择地图的类型
			selectMapType();
			break;
		case R.id.add_scale://放大地图比例
			expandMapScale();
			break;
		case R.id.low_scale://缩小地图比例
			narrowMapScale();
			break;
		case R.id.map_marker:
			addMapMarks();
			break;
		default:
			break;
		}
	}
	/**
	 * @author Mikyou
	 * 添加覆盖物
	 * */
	private void addMapMarks() {
		initMarksData();
		myBaiduMap.clear();//先清除一下图层
		LatLng latLng=null;
		Marker marker=null;
		OverlayOptions options;
		myMarks=BitmapDescriptorFactory.fromResource(R.drawable.mark);//引入自定义的覆盖物图标,将其转化成一个BitmapDescriptor对象
		//遍历MarkInfo的List一个MarkInfo就是一个Mark
		for (int i = 0; i < markInfoList.size(); i++) {
			//经纬度对象
			latLng=new LatLng(markInfoList.get(i).getLatitude(), markInfoList.get(i).getLongitude());//需要创建一个经纬对象,通过该对象就可以定位到处于地图上的某个具体点
			//图标
			options=new MarkerOptions().position(latLng).icon(myMarks).zIndex(6);
			marker=(Marker) myBaiduMap.addOverlay(options);//将覆盖物添加到地图上
			Bundle bundle=new Bundle();//创建一个Bundle对象将每个mark具体信息传过去,当点击该覆盖物图标的时候就会显示该覆盖物的详细信息
			bundle.putSerializable("mark", markInfoList.get(i));
			marker.setExtraInfo(bundle);
		}
		MapStatusUpdate msu=MapStatusUpdateFactory.newLatLng(latLng);//通过这个经纬度对象,地图就可以定位到该点
		myBaiduMap.animateMapStatus(msu);
	}
	/**
	 * @author mikyou
	 * 初始化覆盖物信息数据
	 * */
	private void initMarksData() {
		markInfoList=new ArrayList<MarkInfo>();
		markInfoList.add(new MarkInfo(32.079254, 118.787623, R.drawable.pic1, "英伦贵族小旅馆", "距离209米", 1888));
		markInfoList.add(new MarkInfo(32.064355, 118.787624, R.drawable.pic2, "沙井国际高级会所", "距离459米", 388));
		markInfoList.add(new MarkInfo(28.7487420000, 115.8748860000, R.drawable.pic4, "华东交通大学南区", "距离5米", 888));
		markInfoList.add(new MarkInfo(28.7534890000, 115.8767960000, R.drawable.pic3, "华东交通大学北区", "距离10米", 188));
	   myBaiduMap.setOnMarkerClickListener(this);
	   myBaiduMap.setOnMapClickListener(this);   
	}
	/**
	 * @author zhongqihong
	 * 放大地图的比例
	 * */
	private void narrowMapScale() {
		current-=0.5f;
		MapStatusUpdate msu=MapStatusUpdateFactory.zoomTo(15.0f+current);
		myBaiduMap.animateMapStatus(msu);
	}
	/**
	 *@author zhongqihong
	 *缩小地图的比例 
	 * */
	private void expandMapScale() {
		current+=0.5f;
		MapStatusUpdate msu2=MapStatusUpdateFactory.zoomTo(15.0f+current);
		myBaiduMap.animateMapStatus(msu2);
	}
	/**
	 * @author mikyou
	 * 选择地图的类型
	 * */
	private void selectMapType() {
		AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
		builder.setIcon(R.drawable.icon)
		.setTitle("请选择地图的类型")
		.setItems(types, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				String select=types[which];
				if (select.equals("普通地图")) {
					myBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
				}else if (select.equals("卫星地图")) {
					myBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
				}else if (select.equals("热力地图(已关闭)")||select.equals("热力地图(已打开)")) {
					if(myBaiduMap.isBaiduHeatMapEnabled()) {
						myBaiduMap.setBaiduHeatMapEnabled(false);
						Toast.makeText(MainActivity.this, "热力地图已关闭", 0).show();
						types[which]="热力地图(已关闭)";
					}else {
						myBaiduMap.setBaiduHeatMapEnabled(true);
						Toast.makeText(MainActivity.this, "热力地图已打开", 0).show();
						types[which]="热力地图(已打开)";
					}
				}
			}
		}).show();
	}
	/**
	 * @author mikyou
	 * 是否打开实时交通
	 * */
	private void switchRoadCondition() {
		if (myBaiduMap.isTrafficEnabled()) {//如果是开着的状态,当点击后,就会出关闭状态
			myBaiduMap.setTrafficEnabled(false);
			mapRoad.setImageResource(R.drawable.main_icon_roadcondition_off);
		}else{//如果是的关闭的状态,当点击后,就会处于开启的状态
			myBaiduMap.setTrafficEnabled(true);
			mapRoad.setImageResource(R.drawable.main_icon_roadcondition_on);
		}
	}
	/**
	 * @author mikyou
	 * 覆盖物的点击事件
	 * */
	@Override
	public boolean onMarkerClick(Marker marker) {
		Bundle bundle=  marker.getExtraInfo();
		MarkInfo MyMarker=(MarkInfo) bundle.getSerializable("mark");
		ImageView iv=(ImageView) markLayout.findViewById(R.id.mark_image);
		TextView distanceTv=(TextView) markLayout.findViewById(R.id.distance);
		TextView nameTv=(TextView) markLayout.findViewById(R.id.name);
		TextView zanNumsTv=(TextView) markLayout.findViewById(R.id.zan_nums);
		iv.setImageResource(MyMarker.getImageId());
		distanceTv.setText(MyMarker.getDistance()+"");
		nameTv.setText(MyMarker.getName());
		zanNumsTv.setText(MyMarker.getZanNum()+"");
		//初始化一个InfoWindow
		initInfoWindow(MyMarker,marker);
		markLayout.setVisibility(View.VISIBLE);
		return true;
	}
	/**
	 *@author mikyou
	 *初始化出一个InfoWindow
	 * 
	 * */
	private void initInfoWindow(MarkInfo MyMarker,Marker marker) {
		// TODO Auto-generated method stub
		InfoWindow infoWindow;
		//InfoWindow中显示的View内容样式,显示一个TextView
		TextView infoWindowTv=new TextView(MainActivity.this);
		infoWindowTv.setBackgroundResource(R.drawable.location_tips);
		infoWindowTv.setPadding(30, 20, 30, 50);
		infoWindowTv.setText(MyMarker.getName());
		infoWindowTv.setTextColor(Color.parseColor("#FFFFFF"));

		final LatLng latLng=marker.getPosition();
		Point p=myBaiduMap.getProjection().toScreenLocation(latLng);//将地图上的经纬度转换成屏幕中实际的点
		p.y-=47;//设置屏幕中点的Y轴坐标的偏移量
		LatLng ll=myBaiduMap.getProjection().fromScreenLocation(p);//把修改后的屏幕的点有转换成地图上的经纬度对象
		/**
		 * @author mikyou
		 * 实例化一个InfoWindow的对象
		 * public InfoWindow(View view,LatLng position, int yOffset)通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中,监听事件由开发者实现。
		 *	参数:
		 * view - InfoWindow 展示的 view
		 * position - InfoWindow 显示的地理位置
		 * yOffset - InfoWindow Y 轴偏移量
		 * */
		infoWindow=new InfoWindow(infoWindowTv, ll, 10);
		myBaiduMap.showInfoWindow(infoWindow);//显示InfoWindow
	}
	/**
	 * @author zhongqihong
	 * 给整个地图添加的点击事件
	 * */
	@Override
	public void onMapClick(LatLng arg0) {//表示点击地图其他的地方使得覆盖物的详情介绍的布局隐藏,但是点击已显示的覆盖物详情布局上,则不会消失,因为在详情布局上添加了Clickable=true
		//由于事件的传播机制,因为点击事件首先会在覆盖物布局的父布局(map)中,由于map是可以点击的,map则会把点击事件给消费掉,如果加上Clickable=true表示点击事件由详情布局自己处理,不由map来消费
		markLayout.setVisibility(View.GONE);
		myBaiduMap.hideInfoWindow();//隐藏InfoWindow
	}
	@Override
	public boolean onMapPoiClick(MapPoi arg0) {
		return false;
	}
}

最后效果:

好了今天的百度第二讲就到这了

Demo2下载链接