2016-09-01 3 views

Antwort

3

Beginnend mit 4.1.0 haben wir Markierungsansichten eingeführt. Diese erweitern die Android View-Klasse und ermöglichen es Ihnen, einen eigenen Marker-Adapter zu erstellen. Ich habe a good example erstellt dies zu tun, die Sie in der Demo-App finden können. Ich werde hier einige Codeschnipsel posten, aber es könnte einfacher sein, nur den Quellcode auf Github zu betrachten.

Adapter:

// 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); 
} 
} 

und schließlich 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]; 
    } 
}; 
} 

Im Wesentlichen das macht die markerViews Hintergrund, so dass wir pulsieren kann (belebtes) es aber Sie können Ihre eigenen Attribute einrichten. Weitere Beispiele dafür sind in der testapp zu finden. Hoffe, das ist, was Sie gesucht haben.

+0

Okay, das ist eine nette Lösung, das Problem ist die Leistung. Das ist sehr schrecklich. In meiner App können zu einer bestimmten Zeit mehr als 100 Pins angezeigt werden. Derzeit auf einer einzelnen Stadt, zeigt es 100 Pins. Es ist sehr langsam. Ich konnte dies nur mit MarkerOption implementieren. Aber mir fehlt die Fähigkeit, einige Metadata hinzufügen, was sehr wichtig ist in meiner App (was ich elegant mit diesem tun kann). Ich wollte dasselbe mit MarkerOptions machen. Irgendeine Idee, wenn das auch in MarkerOptions möglich ist? –

+1

Wenn Sie Metadaten mit der MarkerOption speichern möchten, sollten Sie entweder das Objekt erweitern und eine eigene Methode zum Speichern hinzufügen oder eine [Map <>] (https://developer.android.com) verwenden /reference/java/util/Map.html). – cammace

+0

Ja, danke! Ich folgte dem gleichen Schritt für MarkerOption. Es ist schneller als alles andere. MarkerViewOptions ist ein No-Go in unserem Projekt. –

Verwandte Themen