[android] Polygon holes (#8557)

* add 1 hole support to polygon-related classes

* fix no hole crash and add triangle hole shape example

* add support for multiple holes
This commit is contained in:
Pablo Guardiola
2017-04-11 19:10:46 +02:00
committed by GitHub
parent 1d33bf774f
commit b71d86599d
8 changed files with 208 additions and 5 deletions

View File

@@ -0,0 +1,53 @@
package com.mapbox.mapboxsdk.annotations;
import android.os.Parcel;
import android.os.Parcelable;
import com.mapbox.mapboxsdk.geometry.LatLng;
import java.util.ArrayList;
import java.util.List;
/**
* Encapsulates a {@link List} of {@link LatLng} points defining a hole
*/
public class Hole extends ArrayList<LatLng> implements Parcelable {
public Hole() {
super();
}
/**
* Creates a Hole.
*
* @param holePoints {@link List} list of {@link LatLng} points defining a hole
*/
public Hole(List<LatLng> holePoints) {
super(holePoints);
}
protected Hole(Parcel in) {
in.readTypedList(this, LatLng.CREATOR);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeTypedList(this);
}
public static final Parcelable.Creator<Hole> CREATOR = new Parcelable.Creator<Hole>() {
public Hole createFromParcel(Parcel in) {
return new Hole(in);
}
public Hole[] newArray(int size) {
return new Hole[size];
}
};
}

View File

@@ -4,6 +4,9 @@ import android.graphics.Color;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import java.util.ArrayList;
import java.util.List;
/**
* Polygon is a geometry annotation that's a closed loop of coordinates.
*/
@@ -11,9 +14,11 @@ public final class Polygon extends BasePointCollection {
private int fillColor = Color.BLACK; // default fillColor is black
private int strokeColor = Color.BLACK; // default strokeColor is black
private List<Hole> holes;
Polygon() {
super();
holes = new ArrayList<>();
}
/**
@@ -26,7 +31,7 @@ public final class Polygon extends BasePointCollection {
}
/**
* Get the color fo the stroke of the polygon.
* Get the color of the stroke of the polygon.
*
* @return The color of the stroke.
*/
@@ -34,6 +39,15 @@ public final class Polygon extends BasePointCollection {
return strokeColor;
}
/**
* Returns a copy of the holes.
*
* @return A {@link List} of holes.
*/
public List<Hole> getHoles() {
return new ArrayList<>(holes);
}
/**
* Sets the color of the fill region of the polygon.
*
@@ -54,6 +68,27 @@ public final class Polygon extends BasePointCollection {
update();
}
/**
* Sets the holes of this polygon. This method will take a copy of the holes, so further
* mutations to holes will have no effect on this polygon.
*
* @param holes A {@link List} of {@link Hole} points making up the holes.
*/
public void setHoles(List<? extends Hole> holes) {
this.holes = new ArrayList<>(holes);
update();
}
/**
* Add a hole to the polygon.
*
* @param hole A {@link Hole} hole to be added.
*/
void addHole(Hole hole) {
holes.add(hole);
update();
}
@Override
void update() {
MapboxMap mapboxMap = getMapboxMap();

View File

@@ -30,6 +30,9 @@ public final class PolygonOptions implements Parcelable {
ArrayList<LatLng> pointsList = new ArrayList<>();
in.readList(pointsList, LatLng.class.getClassLoader());
addAll(pointsList);
ArrayList<Hole> holes = new ArrayList<>();
in.readTypedList(holes, Hole.CREATOR);
addAllHoles(holes);
alpha(in.readFloat());
fillColor(in.readInt());
strokeColor(in.readInt());
@@ -56,6 +59,7 @@ public final class PolygonOptions implements Parcelable {
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeList(getPoints());
out.writeTypedList(getHoles());
out.writeFloat(getAlpha());
out.writeInt(getFillColor());
out.writeInt(getStrokeColor());
@@ -108,6 +112,43 @@ public final class PolygonOptions implements Parcelable {
return this;
}
/**
* Adds a hole to the outline of the polygon being built.
*
* @param hole {@link Hole} list made up of {@link LatLng} points defining the hole
* @return This {@link PolygonOptions} object with the given hole added to the outline.
*/
public PolygonOptions addHole(Hole hole) {
polygon.addHole(hole);
return this;
}
/**
* Adds holes to the outline of the polygon being built.
*
* @param holes {@link Hole} holes to be added to polygon geometry.
* @return This {@link PolygonOptions} object with the given holes added to the outline.
*/
public PolygonOptions addHole(Hole... holes) {
for (Hole hole : holes) {
addHole(hole);
}
return this;
}
/**
* Adds holes to the outline of the polygon being built.
*
* @param holes {@link Iterable} list made up of {@link Hole} holes defining the hole geometry
* @return This {@link PolygonOptions} object with the given holes added to the outline.
*/
public PolygonOptions addAllHoles(Iterable<Hole> holes) {
for (Hole hole : holes) {
addHole(hole);
}
return this;
}
/**
* Set the alpha value of the polyline.
*
@@ -177,18 +218,33 @@ public final class PolygonOptions implements Parcelable {
return polygon.getStrokeColor();
}
/**
* Gets the points set for this {@link PolygonOptions} object.
*
* @return The list made up of {@link LatLng} points defining the polygon.
*/
public List<LatLng> getPoints() {
// the getter gives us a copy, which is the safe thing to do...
return polygon.getPoints();
}
/**
* Gets the holes set for this {@link PolygonOptions} object.
*
* @return The list made up of {@link List} of {@link LatLng} points defining the holes.
*/
public List<Hole> getHoles() {
return polygon.getHoles();
}
/**
* Compares this {@link PolygonOptions} object with another {@link PolygonOptions} and
* determines if their color, alpha, stroke color, and vertices match.
*
* @param o Another {@link PolygonOptions} to compare with this object.
* @return True if color, alpha, stroke color, and vertices match this {@link PolygonOptions}
* object. Else, false.
* @return True if color, alpha, stroke color, vertices and holes match this {@link PolygonOptions}
* {@link PolygonOptions} object. Else, false.
*/
@Override
public boolean equals(Object o) {
@@ -210,7 +266,10 @@ public final class PolygonOptions implements Parcelable {
if (getStrokeColor() != polygon.getStrokeColor()) {
return false;
}
return !(getPoints() != null ? !getPoints().equals(polygon.getPoints()) : polygon.getPoints() != null);
if (getPoints() != null ? !getPoints().equals(polygon.getPoints()) : polygon.getPoints() != null) {
return false;
}
return !(getHoles() != null ? !getHoles().equals(polygon.getHoles()) : polygon.getHoles() != null);
}
/**
@@ -228,6 +287,7 @@ public final class PolygonOptions implements Parcelable {
result = 31 * result + getFillColor();
result = 31 * result + getStrokeColor();
result = 31 * result + (getPoints() != null ? getPoints().hashCode() : 0);
result = 31 * result + (getHoles() != null ? getHoles().hashCode() : 0);
return result;
}
}