在Mapbox [Android]中为MarkerOptions添加新属性的最佳方法是什么?

时间:2016-09-01 15:36:58

标签: android mapbox

我正在尝试向Mapbox中的标记添加新属性,扩展类会变得有点混乱。

向标记添加新属性的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

4.1.0开始,我们介绍了标记视图。这些扩展了Android View类,允许您创建自己的标记适配器。我已经创建了a good example,您可以在演示应用中找到它。我会在这里发布一些代码片段,但是看一下Github上的源代码可能会更容易。

适配器:

// Custom marker view used for pulsing the background view of marker.
private static class PulseMarkerViewAdapter extends MapboxMap.MarkerViewAdapter<PulseMarkerView> {

private LayoutInflater inflater;

public PulseMarkerViewAdapter(@NonNull Context context) {
  super(context);
  this.inflater = LayoutInflater.from(context);
}

@Nullable
@Override
public View getView(@NonNull PulseMarkerView marker, @Nullable View convertView, @NonNull ViewGroup parent) {
  ViewHolder viewHolder;
  if (convertView == null) {
    viewHolder = new ViewHolder();
    convertView = inflater.inflate(R.layout.view_pulse_marker, parent, false);
    viewHolder.foregroundImageView = (ImageView) convertView.findViewById(R.id.foreground_imageView);
    viewHolder.backgroundImageView = (ImageView) convertView.findViewById(R.id.background_imageview);
    convertView.setTag(viewHolder);
  }
  return convertView;
}

private static class ViewHolder {
  ImageView foregroundImageView;
  ImageView backgroundImageView;
}
}

PulseMarkerView:

public class PulseMarkerView extends MarkerView {

public PulseMarkerView(BaseMarkerViewOptions baseMarkerViewOptions) {
    super(baseMarkerViewOptions);
}
}

最后,PulseMarkerOptions:

public class PulseMarkerViewOptions extends BaseMarkerViewOptions<PulseMarkerView, PulseMarkerViewOptions> {

public PulseMarkerViewOptions() {
}

protected PulseMarkerViewOptions(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 PulseMarkerViewOptions 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 PulseMarkerView getMarker() {
  return new PulseMarkerView(this);
}

public static final Parcelable.Creator<PulseMarkerViewOptions> CREATOR =
new Parcelable.Creator<PulseMarkerViewOptions>() {
  public PulseMarkerViewOptions createFromParcel(Parcel in) {
    return new PulseMarkerViewOptions(in);
  }

  public PulseMarkerViewOptions[] newArray(int size) {
    return new PulseMarkerViewOptions[size];
  }
};
}

基本上这会暴露markerViews背景,以便我们可以脉冲(动画)它,但您可以设置自己的属性。可以在testapp中找到更多这方面的例子。希望这是你想要的。