记录一个前段时间解决的功能需求
先直接上图片看看实现后的效果:
具体需求为,在地图页上显示出所有的场站marker之后,点击左侧的按钮可以实现动态切换场站marker中显示的数据。
实现思路为:构造marker时,icon方法中传入的参数BitmapDescriptor设置为一个自定义的view,而不是一张简单图片,在这个view中,将大头针图片设置为view背景,上面放一个textview,点击按钮的时候,改变textview上面的值就可以了。
(如果没明白继续往下看↓)
====================================
在实现这个需求之前,有必要先了解一下覆盖物(Overlay)的构造方式
1、在百度地图中添加覆盖物,需要传入的参数是覆盖物的设置,返回值为Overlay
Overlay com.baidu.mapapi.map.BaiduMap.addOverlay(OverlayOptions arg0)
2、那么接下来关键就落在了OverlayOptions这个重要的类上面,通过查看api发现,在实现具体功能的时候我们需要用到的是他的一系列子类
ArcOptions, CircleOptions, DotOptions, GroundOverlayOptions, MarkerOptions, PolygonOptions, PolylineOptions, TextOptions
这些子类各有各的特点,这里只说MarkerOptions,我叫他标注物的设置
而观察MarkerOptions这个类的方法会发现,大部分方法的返回值都是MarkerOptions,也就是说创建他的时候可以一路“点”出来
各种各样的属性设置很多,本文就不多说,API上介绍的都很清楚
一般的创建方式是这样的:
MarkerOptions ooA = null;
...
ooA=newMarkerOptions().position(llA).icon(free_view).zIndex(9).draggable(false).extraInfo(mBundle);
==============================================
接下来到重点了
要做出题目中的需求,上面创建ooA的过程中,最重要的方法就是.icon()这个方法了,这个方法顾名思义就是为marker设置显示出的图标、样式,括号中接收的参数是BitmapDescriptor
MarkerOptions.icon(BitmapDescriptor arg0)
也就是说这个icon的来源是一个BitmapDescriptor
查找之后发现BitmapDescriptor的构成方式有以下几种
static BitmapDescriptor fromAsset(java.lang.String assetName)
根据资源名称创建bitmap描述信息
static BitmapDescriptor fromAssetWithDpi(java.lang.String assetName)
根据资源名称和dpi创建bitmap描述信息,根据不同设备的dpi,对asset下图片等比例缩放
static BitmapDescriptor fromBitmap(Bitmap image)
根据 Bitmap 创建描述信息
static BitmapDescriptor fromFile(java.lang.String fileName)
根据应用程序私有文件夹里包含文件的文件名创建 bitmap 描述信息
static BitmapDescriptor fromPath(java.lang.String absolutePath)
根据文件绝对路径创建 bitmap 描述信息
static BitmapDescriptor fromResource(int resourceId)
根据资源 Id 创建 bitmap 描述信息
static BitmapDescriptor fromView(View view)
根据一个 View 创建 Bitmap 描述信息, 当 view 为 null 时返回 null
观察之后,很显然最后一个fromView(View view)是我们需要的
然后画一个我们需要的布局出来:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/icon" >
<TextView
android:id="@+id/tv_num_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥99"
android:textSize="9sp" />
LinearLayout>
接下来就是在代码里添加了:
1、首先通过上面的布局做一个view出来,并且找到那个textview,然后给textview 赋值
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_main_marker, null);
TextView tv_num_price=(TextView) view.findViewById(R.id.tv_num_price);
tv_num_price.setText("标注物上面你想显示的信息");
2、做出BitmapDescriptor
BitmapDescriptor free_view = BitmapDescriptorFactory.fromView(view);
3、创建MarkerOptions
MarkerOptions ooA = null;
...
ooA=newMarkerOptions().position(llA).icon(free_view).zIndex(9).draggable(false).extraInfo(mBundle);
4、在百度地图中显示出标注物
mBaiduMap.addOverlay(ooA)
5、到这里主要部分就基本完成了,下面就是设置一个按钮,点击的时候传不同的显示信息过去给marker显示,这部分这里简单说一下
构造一个功能为显示地图上全部marker的方法,传入的参数为(显示marker用到的数据集合,标记当前需要显示什么内容的flag),当点击切换按钮后,调用一次该方法,根据业务逻辑传入当前需要显示内容的flag(如价格),在方法中判断该flag对应的显示内容即可。
我这里的切换按钮用的是checkbox控件显示的,关于checkbox更换背景相关的问题,请参照我的另一篇博客:
http://blog.csdn.net/qingchen1016/article/details/51199459
如有问题,请留言交流。