上一篇提到了可以通过MapBox的api实现对添加到地图上的marker进行放大缩小,本篇就来说下如何具体实现。
继承MarkerView自定义MyMarkerView
public class MyMarkerView extends MarkerView{
/**
*使用MarkerView的构建器创建MarkerView的实例
*
* @param baseMarkerView选项用于构建MarkerView的构建器
*/
public MyMarkerView (BaseMarkerViewOptions baseMarkerViewOptions) {
super(baseMarkerViewOptions);
}
}
继承BaseMarkerViewOptions
自定义MyMarkerViewOptions
public class MyMarkerViewOptions extends BaseMarkerViewOptions<MyMarkerView, MyMarkerViewOptions> {
public MyMarkerViewOptions() {
}
private MyMarkerViewOptions(Parcel in) {
position((LatLng) in.readParcelable(LatLng.class.getClassLoader()));
snippet(in.readString());
title(in.readString());
flat(in.readByte() != 0);
anchor(in.readFloat(), in.readFloat());
selected = in.readByte() != 0;
rotation(in.readFloat());
if (in.readByte() != 0) {
// this means we have an icon
String iconId = in.readString();
Bitmap iconBitmap = in.readParcelable(Bitmap.class.getClassLoader());
Icon icon = IconFactory.recreate(iconId, iconBitmap);
icon(icon);
}
}
@Override
public MyMarkerViewOptions getThis() {
return this;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeParcelable(getPosition(), flags);
out.writeString(getSnippet());
out.writeString(getTitle());
out.writeByte((byte) (isFlat() ? 1 : 0));
out.writeFloat(getAnchorU());
out.writeFloat(getAnchorV());
out.writeFloat(getInfoWindowAnchorU());
out.writeFloat(getInfoWindowAnchorV());
out.writeByte((byte) (selected ? 1 : 0));
out.writeFloat(getRotation());
Icon icon = getIcon();
out.writeByte((byte) (icon != null ? 1 : 0));
if (icon != null) {
out.writeString(getIcon().getId());
out.writeParcelable(getIcon().getBitmap(), flags);
}
}
@Override
public MyMarkerView getMarker() {
return new MyMarkerView(this);
}
public static final Parcelable.Creator< MyMarkerViewOptions > CREATOR=
new Parcelable.Creator<MyMarkerViewOptions>() {
public MyMarkerViewOptions createFromParcel(Parcel in) {
return new MyMarkerViewOptions(in);
}
public MyMarkerViewOptions[] newArray(int size) {
return new MyMarkerViewOptions[size];
}
};
}
继承
MapBoxMap.MarkerViewAdapter自定义MyMarkerViewAdapter
public class MyMarkerViewAdapter extends MapboxMap.MarkerViewAdapter<MyMarkerView>{
private LayoutInflater inflater;
/**
* Create an instance of MarkerViewAdapter.
*
* @param context the context associated to a MapView
*/
public MyMarkerViewAdapter(Context context) {
super(context);
this.inflater = LayoutInflater.from(context);
}
@Nullable
@Override
public View getView(@NonNull MyMarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.layout_marker_view, parent, false);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
@Override
public boolean onSelect(@NonNull MyMarkerView marker, @NonNull View convertView, boolean reselectionFromRecycling) {
Log.d("MarkerViewAdapter onSelect");
//设置大小
ImageView iconImageView = (ImageView) convertView.findViewById(R.id.marker_icon);
iconImageView.setImageResource(R.drawable.a_big);
return super.onSelect(marker, convertView, reselectionFromRecycling);
}
@Override
public void onDeselect(@NonNull MyMarkerView marker, @NonNull View convertView) {
LogUtils.d("MarkerViewAdapter onDeselect");
//设置大小
ImageView iconImageView = (ImageView) convertView.findViewById(R.id.marker_icon);
iconImageView.setImageResource(R.drawable.a_normal);
}
private static class ViewHolder {
ImageView iconImageView;
}
准备工作都定义好了如何使用?
1.获取mapboxmap设置adapter
com.mapbox.mapboxsdk.maps.MapView)mapview.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(MapboxMap mapboxMap) {
// Customize map with markers, polylines, etc.
//设置管理MarkerView
MarkerViewManager markerViewManager = mapboxMap.getMarkerViewManager();
MyMarkerViewAdapter markerViewAdapter=new MyMarkerViewAdapter(MyApplication.getInstance(); m markerViewManager.addMarkerViewAdapter(markerViewAdapter);
}
});
2.向地图添加MyMarkerView
MyMarkerViewOptions overlayOptions = new MyMarkerViewOptions();
double nLatitude = 39.99;
double nLongitude = 111.11;
overlayOptions.position(new LatLng(nLatitude, nLongitude));
MyMarkerView testMarker=(MyMarkerView)mapboxMap.addMarker(overlayOptions);
3.设置marker选中状态
mapBoxMap.selectMarker(testMarker);//设置marker被选中状态放大
mapBoxMap.deselectMarker(testMarker);//设置marker非选中状态缩小
ok,现在就可以实现marker放大缩小的需求了,与任何需求修改,只需要修改MyMarkerViewAdapter就可以了。