要想坑少,必须知道的多,不然只能踩着坑走了
网上的资料都是片段,这里经过整合已经可以很好很简单的实现了!!
本文直接带你实现点击地图在指定位置显示PopUpWindow
效果图如下
1.创建pop
这个就很多了,也比较简单就不啰嗦了
2.显示pop
推荐博客:popwindow位置解析
3.关联到百度地图
思路:将地图平移到指定的坐标点(目的地),然后将pop显示在控件的中央
上代码:
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(20.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory
.newMapStatus(builder.build()));
// TODO 摆放window的位置
Log.d("zjs", " 最终显示----控件的h=" + height + " /w = " + width);
if (height == 0 && width == 0)return;
naviWindow.showAtLocation(mMapView, Gravity.BOTTOM| Gravity.LEFT, ((width-navi.getWidth()) / 2), ((height+navi.getHeight()) / 2));
navi.setLatLng(ll);//设置重点
addDestInfoOverlay(ll);// 添加图标
参数
ll:(LatLng)目的地,或者指定的位置
18.0f (百度地图的显示比例尺(精度))
showAtLocation:
参数1:显示的控件中;//这里当然是百度地图的地图显示界面
参数2:引力属性(或者说相对于父控件的大概位置)
参数3:x轴偏移量(相对于手机屏幕坐标系)
参数4:y轴的偏移量(相对于手机屏幕坐标系)
这里应该就结束了
想看的同志们接下来,我们来一起分析我遇到的坑:
1.showAtLocation的第二个参数,看官方注释
Display the content view in a popup window at the specified location.
If the popup window cannot fit on screen, it will be clipped.
Specifying a gravity of android.view.Gravity.NO_GRAVITY is similar to specifying Gravity.LEFT | Gravity.TOP.
所以英语不好只能看着有道,挠着大脑了,
还是要看,我就是应为这个没怎么看懂而去尝试百度的标注marker的icon(fromView)的方法;走偏了(这个View不能有子控件,只能显示图片或者文字–所以只能看不能点)
pass掉
认真看介绍的那个博客,第二个参数应该是相对于父容器的位置,所以写法也很简单,都是Gravity的常量,而且也是可以通过“ | ”来叠加的,和布局一样
2.只有在控件完全加载到界面中,才能获取控件的相关属性,所以获取控件的位置这里可以参考博客
其中关键的代码
llMain.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if(height!=0&&width!=0)return;
llMain.postDelayed(new Runnable() {
@Override
public void run() {
height = mMapView.getHeight();
width = mMapView.getWidth();
}
}, 300);
}
});
参数1:LLamin:这里是View的子类(应该是父容器,最好的是GroupView),用于去获取测量观察者
参数2.postDelayed:开启轻量级线程用于去测量,
参数3.height,width,我们需要的结果!!!
在开启前加了一个判断,只要有值就不去做测量,因为只要有就好了
用于显示popupwindow!
有问题可以回复,看到肯定回答,
最后demo的地址