[android] #3754 - newLatLngBounds: unit tests for LatLng and LatLngBounds, builder pattern + refactoring.
[android] #3754 - Working version using the underlying VisibleCoorindateBounds [android] #3754 - refactor Camera api inside maps package, correctly use factory pattern, LatLngBounds hooks into camera API [android] #3754 - cleanup old API
This commit is contained in:
@@ -9,8 +9,7 @@ import com.mapbox.mapboxsdk.R;
|
||||
import com.mapbox.mapboxsdk.constants.MapboxConstants;
|
||||
import com.mapbox.mapboxsdk.constants.MathConstants;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
import com.mapbox.mapboxsdk.maps.MapView;
|
||||
import com.mapbox.mapboxsdk.maps.MapboxMap;
|
||||
import com.mapbox.mapboxsdk.maps.CameraUpdateFactory;
|
||||
import com.mapbox.mapboxsdk.utils.MathUtils;
|
||||
|
||||
public final class CameraPosition implements Parcelable {
|
||||
@@ -161,11 +160,11 @@ public final class CameraPosition implements Parcelable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Builder from an existing PositionCameraUpdate update.
|
||||
* Create Builder from an existing CameraPositionUpdate update.
|
||||
*
|
||||
* @param update Update containing camera options
|
||||
*/
|
||||
public Builder(CameraUpdateFactory.PositionCameraUpdate update) {
|
||||
public Builder(CameraUpdateFactory.CameraPositionUpdate update) {
|
||||
super();
|
||||
if (update != null) {
|
||||
this.bearing = update.getBearing();
|
||||
@@ -177,7 +176,7 @@ public final class CameraPosition implements Parcelable {
|
||||
|
||||
|
||||
/**
|
||||
* Create Builder from an existing PositionCameraUpdate update.
|
||||
* Create Builder from an existing CameraPositionUpdate update.
|
||||
*
|
||||
* @param update Update containing camera options
|
||||
*/
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.mapbox.mapboxsdk.camera;
|
||||
|
||||
public interface CameraUpdate {
|
||||
|
||||
}
|
||||
@@ -1,225 +0,0 @@
|
||||
package com.mapbox.mapboxsdk.camera;
|
||||
|
||||
import android.graphics.Point;
|
||||
import android.support.annotation.IntDef;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
public class CameraUpdateFactory {
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the camera to a specified CameraPosition.
|
||||
*
|
||||
* @param cameraPosition Camera Position to change to
|
||||
* @return CameraUpdate Final Camera Position data
|
||||
*/
|
||||
public static CameraUpdate newCameraPosition(@NonNull CameraPosition cameraPosition) {
|
||||
return new PositionCameraUpdate(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude
|
||||
* specified by a LatLng object. This centers the camera on the LatLng object.
|
||||
*
|
||||
* @param latLng
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLng(@NonNull LatLng latLng) {
|
||||
return new PositionCameraUpdate(-1, latLng, -1, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that transforms the camera such that the specified latitude/longitude
|
||||
* bounds are centered on screen at the greatest possible zoom level.
|
||||
* You can specify padding, in order to inset the bounding box from the map view's edges.
|
||||
* The returned CameraUpdate has a bearing of 0 and a tilt of 0.
|
||||
*
|
||||
* @param bounds
|
||||
* @param padding
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int padding) {
|
||||
throw new UnsupportedOperationException("Not implemented yet");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that transforms the camera such that the specified latitude/longitude
|
||||
* bounds are centered on screen within a bounding box of specified dimensions at the greatest
|
||||
* possible zoom level. You can specify additional padding, to further restrict the size of
|
||||
* the bounding box. The returned CameraUpdate has a bearing of 0 and a tilt of 0.
|
||||
*
|
||||
* @param bounds
|
||||
* @param width
|
||||
* @param height
|
||||
* @param padding
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int width, int height, int padding) {
|
||||
throw new UnsupportedOperationException("Not implemented yet");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude specified by a LatLng object, and moves to the given zoom level.
|
||||
*
|
||||
* @param latLng
|
||||
* @param zoom
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngZoom(@NonNull LatLng latLng, float zoom) {
|
||||
return new PositionCameraUpdate(-1, latLng, -1, zoom);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that scrolls the camera over the map, shifting the center of view by the specified number of pixels in the x and y directions.
|
||||
*
|
||||
* @param xPixel
|
||||
* @param yPixel
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate scrollBy(float xPixel, float yPixel) {
|
||||
throw new UnsupportedOperationException("Not implemented yet");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
|
||||
*
|
||||
* @param amount
|
||||
* @param focus
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomBy(float amount, Point focus) {
|
||||
return new ZoomUpdate(amount, focus.x, focus.y);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
|
||||
*
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomBy(float amount) {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_BY, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that zooms in on the map by moving the viewpoint's height closer to the Earth's surface. The zoom increment is 1.0.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomIn() {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_IN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that zooms out on the map by moving the viewpoint's height farther away from the Earth's surface. The zoom increment is -1.0.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomOut() {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_OUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the camera viewpoint to a particular zoom level.
|
||||
*
|
||||
* @param zoom
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomTo(float zoom) {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_TO, zoom);
|
||||
}
|
||||
|
||||
//
|
||||
// CameraUpdate types
|
||||
//
|
||||
|
||||
public static class PositionCameraUpdate implements CameraUpdate {
|
||||
|
||||
private final float bearing;
|
||||
private final LatLng target;
|
||||
private final float tilt;
|
||||
private final float zoom;
|
||||
|
||||
PositionCameraUpdate(float bearing, LatLng target, float tilt, float zoom) {
|
||||
this.bearing = bearing;
|
||||
this.target = target;
|
||||
this.tilt = tilt;
|
||||
this.zoom = zoom;
|
||||
}
|
||||
|
||||
public LatLng getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
public float getBearing() {
|
||||
return bearing;
|
||||
}
|
||||
|
||||
public float getTilt() {
|
||||
return tilt;
|
||||
}
|
||||
|
||||
public float getZoom() {
|
||||
return zoom;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ZoomUpdate implements CameraUpdate {
|
||||
|
||||
@IntDef({ZOOM_IN, ZOOM_OUT, ZOOM_BY, ZOOM_TO, ZOOM_TO_POINT})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface Type {
|
||||
}
|
||||
|
||||
public static final int ZOOM_IN = 0;
|
||||
public static final int ZOOM_OUT = 1;
|
||||
public static final int ZOOM_BY = 2;
|
||||
public static final int ZOOM_TO = 3;
|
||||
public static final int ZOOM_TO_POINT = 4;
|
||||
|
||||
@Type
|
||||
private final int type;
|
||||
private final float zoom;
|
||||
private float x;
|
||||
private float y;
|
||||
|
||||
ZoomUpdate(@Type int type) {
|
||||
this.type = type;
|
||||
this.zoom = 0;
|
||||
}
|
||||
|
||||
ZoomUpdate(@Type int type, float zoom) {
|
||||
this.type = type;
|
||||
this.zoom = zoom;
|
||||
}
|
||||
|
||||
ZoomUpdate(float zoom, float x, float y) {
|
||||
this.type = ZOOM_TO_POINT;
|
||||
this.zoom = zoom;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public float getZoom() {
|
||||
return zoom;
|
||||
}
|
||||
|
||||
@Type
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.mapbox.mapboxsdk.exceptions;
|
||||
|
||||
public class InvalidLatLngBoundsException extends RuntimeException {
|
||||
|
||||
public InvalidLatLngBoundsException(int latLngsListSize) {
|
||||
super("Cannot create a LatLngBounds from " + latLngsListSize +" items");
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package com.mapbox.mapboxsdk.geometry;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* A rectangular geograpical region defined by a south west {@link LatLng} and a north east {@link LatLng}.
|
||||
*/
|
||||
public class CoordinateBounds implements Parcelable {
|
||||
|
||||
private LatLng mSouthWest;
|
||||
private LatLng mNorthEast;
|
||||
|
||||
public CoordinateBounds(@NonNull Parcel in) {
|
||||
mSouthWest = in.readParcelable(LatLng.class.getClassLoader());
|
||||
mNorthEast = in.readParcelable(LatLng.class.getClassLoader());
|
||||
}
|
||||
|
||||
public CoordinateBounds(@NonNull LatLng southWest, @NonNull LatLng northEast) {
|
||||
mSouthWest = southWest;
|
||||
mNorthEast = northEast;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public LatLng getSouthWest() {
|
||||
return mSouthWest;
|
||||
}
|
||||
|
||||
public void setSouthWest(@NonNull LatLng mSouthWest) {
|
||||
this.mSouthWest = mSouthWest;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public LatLng getNorthEast() {
|
||||
return mNorthEast;
|
||||
}
|
||||
|
||||
public void setNorthEast(@NonNull LatLng mNorthEast) {
|
||||
this.mNorthEast = mNorthEast;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result;
|
||||
long temp;
|
||||
temp = mSouthWest.hashCode();
|
||||
result = (int) (temp ^ (temp >>> 32));
|
||||
temp = mNorthEast.hashCode();
|
||||
result = 31 * result + (int) (temp ^ (temp >>> 32));
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o instanceof CoordinateBounds) {
|
||||
CoordinateBounds other = (CoordinateBounds) o;
|
||||
return getNorthEast().equals(other.getNorthEast())
|
||||
&& getSouthWest().equals(other.getSouthWest());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CoordinateBounds [mNorthEast[" + getNorthEast() + "], mSouthWest[]" + getSouthWest() + "]";
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<CoordinateBounds> CREATOR =
|
||||
new Parcelable.Creator<CoordinateBounds>() {
|
||||
@Override
|
||||
public CoordinateBounds createFromParcel(Parcel in) {
|
||||
return new CoordinateBounds(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CoordinateBounds[] newArray(int size) {
|
||||
return new CoordinateBounds[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int arg1) {
|
||||
out.writeParcelable(mSouthWest, arg1);
|
||||
out.writeParcelable(mNorthEast, arg1);
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
package com.mapbox.mapboxsdk.geometry;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* A geographical region defined by a {@link LatLng} and a {@link CoordinateSpan}.
|
||||
*/
|
||||
public class CoordinateRegion implements Parcelable{
|
||||
|
||||
private LatLng mCenter;
|
||||
private CoordinateSpan mSpan;
|
||||
|
||||
public CoordinateRegion(@NonNull Parcel in){
|
||||
mCenter = in.readParcelable(LatLng.class.getClassLoader());
|
||||
mSpan = in.readParcelable(CoordinateSpan.class.getClassLoader());
|
||||
}
|
||||
|
||||
public CoordinateRegion(@NonNull LatLng center, @NonNull CoordinateSpan span) {
|
||||
mCenter = center;
|
||||
mSpan = span;
|
||||
}
|
||||
|
||||
public LatLng getCenter() {
|
||||
return mCenter;
|
||||
}
|
||||
|
||||
public void setCenter(@NonNull LatLng center) {
|
||||
mCenter = center;
|
||||
}
|
||||
|
||||
public CoordinateSpan getSpan() {
|
||||
return mSpan;
|
||||
}
|
||||
|
||||
public void setSpan(@NonNull CoordinateSpan span) {
|
||||
this.mSpan = span;
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<CoordinateRegion> CREATOR =
|
||||
new Parcelable.Creator<CoordinateRegion>() {
|
||||
@Override
|
||||
public CoordinateRegion createFromParcel(Parcel in) {
|
||||
return new CoordinateRegion(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CoordinateRegion[] newArray(int size) {
|
||||
return new CoordinateRegion[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int arg1) {
|
||||
out.writeParcelable(mCenter, arg1);
|
||||
out.writeParcelable(mSpan, arg1);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,14 @@ package com.mapbox.mapboxsdk.geometry;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.mapbox.mapboxsdk.annotations.Icon;
|
||||
import com.mapbox.mapboxsdk.annotations.Marker;
|
||||
import com.mapbox.mapboxsdk.exceptions.InvalidLatLngBoundsException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -15,46 +22,20 @@ public class LatLngBounds implements Parcelable {
|
||||
private final double mLonEast;
|
||||
private final double mLonWest;
|
||||
|
||||
private final boolean mIsValid;
|
||||
|
||||
/**
|
||||
* Construct a new LatLngBounds based on its corners, given in NESW
|
||||
* order.
|
||||
*
|
||||
* @param northLatitude Northern Latitude
|
||||
* @param eastLongitude Eastern Longitude
|
||||
* @param eastLongitude Eastern Longitude
|
||||
* @param southLatitude Southern Latitude
|
||||
* @param westLongitude Western Longitude
|
||||
* @param westLongitude Western Longitude
|
||||
*/
|
||||
public LatLngBounds(final double northLatitude, final double eastLongitude, final double southLatitude, final double westLongitude) {
|
||||
LatLngBounds(final double northLatitude, final double eastLongitude, final double southLatitude, final double westLongitude) {
|
||||
this.mLatNorth = northLatitude;
|
||||
this.mLonEast = eastLongitude;
|
||||
this.mLatSouth = southLatitude;
|
||||
this.mLonWest = westLongitude;
|
||||
this.mIsValid = ((this.mLonWest < this.mLonEast) && (this.mLatNorth > this.mLatSouth));
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new LatLngBounds based on its corners, given in NESW order.
|
||||
*
|
||||
* @param northEast Coordinate
|
||||
* @param southWest Coordinate
|
||||
*/
|
||||
public LatLngBounds(final LatLng northEast, final LatLng southWest) {
|
||||
this(northEast.getLatitude(), northEast.getLongitude(), southWest.getLatitude(), southWest.getLongitude());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a LatLngBounds box from another LatLngBounds
|
||||
*
|
||||
* @param other the other LatLngBounds
|
||||
*/
|
||||
public LatLngBounds(final LatLngBounds other) {
|
||||
this.mLatNorth = other.getLatNorth();
|
||||
this.mLonEast = other.getLonEast();
|
||||
this.mLatSouth = other.getLatSouth();
|
||||
this.mLonWest = other.getLonWest();
|
||||
this.mIsValid = other.isValid();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -84,10 +65,6 @@ public class LatLngBounds implements Parcelable {
|
||||
return this.mLonWest;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return this.mIsValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the area spanned by this LatLngBounds
|
||||
*
|
||||
@@ -123,7 +100,7 @@ public class LatLngBounds implements Parcelable {
|
||||
*
|
||||
* @return boolean indicating if span is empty
|
||||
*/
|
||||
public boolean isEmpty() {
|
||||
public boolean isEmptySpan() {
|
||||
return getLongitudeSpan() == 0.0 || getLatitudeSpan() == 0.0;
|
||||
}
|
||||
|
||||
@@ -139,7 +116,7 @@ public class LatLngBounds implements Parcelable {
|
||||
* @param latLngs List of LatLng objects
|
||||
* @return LatLngBounds
|
||||
*/
|
||||
public static LatLngBounds fromLatLngs(final List<? extends ILatLng> latLngs) {
|
||||
static LatLngBounds fromLatLngs(final List<? extends ILatLng> latLngs) {
|
||||
double minLat = 90,
|
||||
minLon = 180,
|
||||
maxLat = -90,
|
||||
@@ -158,6 +135,10 @@ public class LatLngBounds implements Parcelable {
|
||||
return new LatLngBounds(maxLat, maxLon, minLat, minLon);
|
||||
}
|
||||
|
||||
public LatLng[] toLatLngs(){
|
||||
return new LatLng[]{new LatLng(mLatNorth,mLonEast),new LatLng(mLatSouth,mLonWest)};
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether this LatLngBounds matches another one via LatLng.
|
||||
*
|
||||
@@ -167,8 +148,8 @@ public class LatLngBounds implements Parcelable {
|
||||
@Override
|
||||
public boolean equals(final Object o) {
|
||||
if (this == o) return true;
|
||||
if (o instanceof BoundingBox) {
|
||||
BoundingBox other = (BoundingBox) o;
|
||||
if (o instanceof LatLngBounds) {
|
||||
LatLngBounds other = (LatLngBounds) o;
|
||||
return mLatNorth == other.getLatNorth()
|
||||
&& mLatSouth == other.getLatSouth()
|
||||
&& mLonEast == other.getLonEast()
|
||||
@@ -184,7 +165,7 @@ public class LatLngBounds implements Parcelable {
|
||||
* @param latLng the point which may be contained
|
||||
* @return true, if the point is contained within the box.
|
||||
*/
|
||||
public boolean contains(final ILatLng latLng) {
|
||||
public boolean including(final ILatLng latLng) {
|
||||
final double latitude = latLng.getLatitude();
|
||||
final double longitude = latLng.getLongitude();
|
||||
return ((latitude < this.mLatNorth)
|
||||
@@ -242,14 +223,14 @@ public class LatLngBounds implements Parcelable {
|
||||
/**
|
||||
* Returns a new LatLngBounds that is the intersection of this with another LatLngBounds
|
||||
*
|
||||
* @param northLongitude Northern Longitude
|
||||
* @param eastLatitude Eastern Latitude
|
||||
* @param southLongitude Southern Longitude
|
||||
* @param westLatitude Western Latitude
|
||||
* @param northLatitude Northern Longitude
|
||||
* @param eastLongitude Eastern Latitude
|
||||
* @param southLatitude Southern Longitude
|
||||
* @param westLongitude Western Latitude
|
||||
* @return LatLngBounds
|
||||
*/
|
||||
public LatLngBounds intersect(double northLongitude, double eastLatitude, double southLongitude, double westLatitude) {
|
||||
return intersect(new LatLngBounds(northLongitude, eastLatitude, southLongitude, westLatitude));
|
||||
public LatLngBounds intersect(double northLatitude, double eastLongitude, double southLatitude, double westLongitude) {
|
||||
return intersect(new LatLngBounds(northLatitude, eastLongitude, southLatitude, westLongitude));
|
||||
}
|
||||
|
||||
public static final Parcelable.Creator<LatLngBounds> CREATOR =
|
||||
@@ -293,4 +274,25 @@ public class LatLngBounds implements Parcelable {
|
||||
final double latWest = in.readDouble();
|
||||
return new LatLngBounds(lonNorth, latEast, lonSouth, latWest);
|
||||
}
|
||||
|
||||
public static final class Builder {
|
||||
|
||||
private List<LatLng> mLatLngList;
|
||||
|
||||
public Builder() {
|
||||
mLatLngList = new ArrayList<>();
|
||||
}
|
||||
|
||||
public LatLngBounds build() {
|
||||
if (mLatLngList.size() < 2) {
|
||||
throw new InvalidLatLngBoundsException(mLatLngList.size());
|
||||
}
|
||||
return LatLngBounds.fromLatLngs(mLatLngList);
|
||||
}
|
||||
|
||||
public Builder include(@NonNull LatLng latLng) {
|
||||
mLatLngList.add(latLng);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.mapbox.mapboxsdk.maps;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.maps.MapboxMap;
|
||||
|
||||
public interface CameraUpdate {
|
||||
|
||||
CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,362 @@
|
||||
package com.mapbox.mapboxsdk.maps;
|
||||
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.RectF;
|
||||
import android.support.annotation.IntDef;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
|
||||
import com.mapbox.mapboxsdk.utils.MathUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
public class CameraUpdateFactory {
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the camera to a specified CameraPosition.
|
||||
*
|
||||
* @param cameraPosition Camera Position to change to
|
||||
* @return CameraUpdate Final Camera Position data
|
||||
*/
|
||||
public static CameraUpdate newCameraPosition(@NonNull CameraPosition cameraPosition) {
|
||||
return new CameraPositionUpdate(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude
|
||||
* specified by a LatLng object. This centers the camera on the LatLng object.
|
||||
*
|
||||
* @param latLng
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLng(@NonNull LatLng latLng) {
|
||||
return new CameraPositionUpdate(-1, latLng, -1, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that transforms the camera such that the specified latitude/longitude
|
||||
* bounds are centered on screen at the greatest possible zoom level.
|
||||
* You can specify padding, in order to inset the bounding box from the map view's edges.
|
||||
* The returned CameraUpdate has a bearing of 0 and a tilt of 0.
|
||||
*
|
||||
* @param bounds
|
||||
* @param padding
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int padding) {
|
||||
return newLatLngBounds(bounds, padding, padding, padding, padding);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that transforms the camera such that the specified latitude/longitude
|
||||
* bounds are centered on screen at the greatest possible zoom level.
|
||||
* You can specify padding, in order to inset the bounding box from the map view's edges.
|
||||
* The returned CameraUpdate has a bearing of 0 and a tilt of 0.
|
||||
*
|
||||
* @param bounds
|
||||
* @param paddingLeft
|
||||
* @param paddingTop
|
||||
* @param paddingRight
|
||||
* @param paddingBottom
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) {
|
||||
return new CameraBoundsUpdate(bounds, paddingLeft, paddingTop, paddingRight, paddingBottom);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Returns a CameraUpdate that transforms the camera such that the specified latitude/longitude
|
||||
// * bounds are centered on screen within a bounding box of specified dimensions at the greatest
|
||||
// * possible zoom level. You can specify additional padding, to further restrict the size of
|
||||
// * the bounding box. The returned CameraUpdate has a bearing of 0 and a tilt of 0.
|
||||
// *
|
||||
// * @param bounds
|
||||
// * @param width
|
||||
// * @param height
|
||||
// * @param padding
|
||||
// * @return
|
||||
// */
|
||||
// public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int width, int height, int padding) {
|
||||
// throw new UnsupportedOperationException("Not implemented yet");
|
||||
// }
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude specified by a LatLng object, and moves to the given zoom level.
|
||||
*
|
||||
* @param latLng
|
||||
* @param zoom
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate newLatLngZoom(@NonNull LatLng latLng, float zoom) {
|
||||
return new CameraPositionUpdate(-1, latLng, -1, zoom);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Returns a CameraUpdate that scrolls the camera over the map, shifting the center of view by the specified number of pixels in the x and y directions.
|
||||
// *
|
||||
// * @param xPixel
|
||||
// * @param yPixel
|
||||
// * @return
|
||||
// */
|
||||
// public static CameraUpdate scrollBy(float xPixel, float yPixel) {
|
||||
// throw new UnsupportedOperationException("Not implemented yet");
|
||||
// }
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
|
||||
*
|
||||
* @param amount
|
||||
* @param focus
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomBy(float amount, Point focus) {
|
||||
return new ZoomUpdate(amount, focus.x, focus.y);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
|
||||
*
|
||||
* @param amount
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomBy(float amount) {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_BY, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that zooms in on the map by moving the viewpoint's height closer to the Earth's surface. The zoom increment is 1.0.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomIn() {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_IN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that zooms out on the map by moving the viewpoint's height farther away from the Earth's surface. The zoom increment is -1.0.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomOut() {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_OUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CameraUpdate that moves the camera viewpoint to a particular zoom level.
|
||||
*
|
||||
* @param zoom
|
||||
* @return
|
||||
*/
|
||||
public static CameraUpdate zoomTo(float zoom) {
|
||||
return new ZoomUpdate(ZoomUpdate.ZOOM_TO, zoom);
|
||||
}
|
||||
|
||||
//
|
||||
// CameraUpdate types
|
||||
//
|
||||
|
||||
public static class CameraPositionUpdate implements CameraUpdate {
|
||||
|
||||
private final float bearing;
|
||||
private final LatLng target;
|
||||
private final float tilt;
|
||||
private final float zoom;
|
||||
|
||||
CameraPositionUpdate(float bearing, LatLng target, float tilt, float zoom) {
|
||||
this.bearing = bearing;
|
||||
this.target = target;
|
||||
this.tilt = tilt;
|
||||
this.zoom = zoom;
|
||||
}
|
||||
|
||||
public LatLng getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
public float getBearing() {
|
||||
return bearing;
|
||||
}
|
||||
|
||||
public float getTilt() {
|
||||
return tilt;
|
||||
}
|
||||
|
||||
public float getZoom() {
|
||||
return zoom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
|
||||
return new CameraPosition.Builder(this).build();
|
||||
}
|
||||
}
|
||||
|
||||
public static class CameraBoundsUpdate implements CameraUpdate {
|
||||
|
||||
private LatLngBounds bounds;
|
||||
private RectF padding;
|
||||
|
||||
public CameraBoundsUpdate(LatLngBounds bounds, RectF padding) {
|
||||
this.bounds = bounds;
|
||||
this.padding = padding;
|
||||
}
|
||||
|
||||
public CameraBoundsUpdate(LatLngBounds bounds, int[] padding) {
|
||||
this(bounds, new RectF(padding[0], padding[1], padding[2], padding[3]));
|
||||
}
|
||||
|
||||
public CameraBoundsUpdate(LatLngBounds bounds, int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) {
|
||||
this(bounds, new int[]{paddingLeft, paddingTop, paddingRight, paddingBottom});
|
||||
}
|
||||
|
||||
public LatLngBounds getBounds() {
|
||||
return bounds;
|
||||
}
|
||||
|
||||
public RectF getPadding() {
|
||||
return padding;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
|
||||
MapView mapView = mapboxMap.getMapView();
|
||||
RectF padding = getPadding();
|
||||
|
||||
// Calculate the bounds of the possibly rotated shape with respect to the viewport.
|
||||
PointF nePixel = new PointF(-10000, -10000);
|
||||
PointF swPixel = new PointF(1000, 10000);
|
||||
float viewportHeight = mapView.getHeight();
|
||||
for (LatLng latLng : getBounds().toLatLngs()) {
|
||||
PointF pixel = mapView.toScreenLocation(latLng);
|
||||
swPixel.x = Math.min(swPixel.x, pixel.x);
|
||||
nePixel.x = Math.max(nePixel.x, pixel.x);
|
||||
swPixel.y = Math.min(swPixel.y, viewportHeight - pixel.y);
|
||||
nePixel.y = Math.max(nePixel.y, viewportHeight - pixel.y);
|
||||
}
|
||||
|
||||
float width = nePixel.x - swPixel.x;
|
||||
float height = nePixel.y - swPixel.y;
|
||||
|
||||
// Calculate the zoom level.
|
||||
float scaleX = (mapView.getWidth() - padding.left - padding.right) / width;
|
||||
float scaleY = (mapView.getHeight() - padding.top - padding.bottom) / height;
|
||||
float minScale = scaleX < scaleY ? scaleX : scaleY;
|
||||
double zoom = Math.log(mapView.getScale() * minScale) / Math.log(2);
|
||||
zoom = MathUtils.clamp(zoom, (float) mapView.getMinZoom(), (float) mapView.getMaxZoom());
|
||||
|
||||
// Calculate the center point of a virtual bounds that is extended in all directions by padding.
|
||||
PointF paddedNEPixel = new PointF(nePixel.x + padding.right / minScale, nePixel.y + padding.top / minScale);
|
||||
PointF paddedSWPixel = new PointF(swPixel.x - padding.left / minScale, swPixel.y - padding.bottom / minScale);
|
||||
PointF centerPixel = new PointF((paddedNEPixel.x + paddedSWPixel.x) / 2, (paddedNEPixel.y + paddedSWPixel.y) / 2);
|
||||
|
||||
centerPixel.y = viewportHeight - centerPixel.y;
|
||||
|
||||
LatLng center = mapboxMap.fromScreenLocation(centerPixel);
|
||||
|
||||
return new CameraPosition.Builder()
|
||||
.target(center)
|
||||
.zoom((float) zoom)
|
||||
.tilt(0)
|
||||
.bearing(0)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
public static class ZoomUpdate implements CameraUpdate {
|
||||
|
||||
@IntDef({ZOOM_IN, ZOOM_OUT, ZOOM_BY, ZOOM_TO, ZOOM_TO_POINT})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface Type {
|
||||
}
|
||||
|
||||
public static final int ZOOM_IN = 0;
|
||||
public static final int ZOOM_OUT = 1;
|
||||
public static final int ZOOM_BY = 2;
|
||||
public static final int ZOOM_TO = 3;
|
||||
public static final int ZOOM_TO_POINT = 4;
|
||||
|
||||
@Type
|
||||
private final int type;
|
||||
private final float zoom;
|
||||
private float x;
|
||||
private float y;
|
||||
|
||||
ZoomUpdate(@Type int type) {
|
||||
this.type = type;
|
||||
this.zoom = 0;
|
||||
}
|
||||
|
||||
ZoomUpdate(@Type int type, float zoom) {
|
||||
this.type = type;
|
||||
this.zoom = zoom;
|
||||
}
|
||||
|
||||
ZoomUpdate(float zoom, float x, float y) {
|
||||
this.type = ZOOM_TO_POINT;
|
||||
this.zoom = zoom;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public float getZoom() {
|
||||
return zoom;
|
||||
}
|
||||
|
||||
@Type
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public float transformZoom(float currentZoom) {
|
||||
switch (getType()) {
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_IN:
|
||||
currentZoom++;
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_OUT:
|
||||
currentZoom--;
|
||||
if (currentZoom < 0) {
|
||||
currentZoom = 0;
|
||||
}
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO:
|
||||
currentZoom = getZoom();
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_BY:
|
||||
currentZoom = currentZoom + getZoom();
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT:
|
||||
currentZoom = currentZoom + getZoom();
|
||||
break;
|
||||
}
|
||||
return currentZoom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
|
||||
CameraPosition cameraPosition = mapboxMap.getCameraPosition();
|
||||
if (getType() != CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT) {
|
||||
return new CameraPosition.Builder(cameraPosition)
|
||||
.zoom(transformZoom(cameraPosition.zoom))
|
||||
.build();
|
||||
} else {
|
||||
return new CameraPosition.Builder(cameraPosition)
|
||||
.zoom(transformZoom(cameraPosition.zoom))
|
||||
.target(mapboxMap.fromScreenLocation(new PointF(getX(), getY())))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,6 @@ import com.mapbox.mapboxsdk.utils.ApiAccess;
|
||||
public class MapFragment extends Fragment {
|
||||
|
||||
private MapView mMap;
|
||||
private OnMapReadyCallback mMapReadyCallback;
|
||||
|
||||
public static MapFragment newInstance(){
|
||||
return new MapFragment();
|
||||
@@ -61,9 +60,6 @@ public class MapFragment extends Fragment {
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
mMap.onResume();
|
||||
if(mMapReadyCallback!=null){
|
||||
mMapReadyCallback.onMapReady(mMap.getMapboxMap());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,6 +95,6 @@ public class MapFragment extends Fragment {
|
||||
|
||||
@NonNull
|
||||
public void getMapAsync(@NonNull OnMapReadyCallback onMapReadyCallback){
|
||||
mMapReadyCallback = onMapReadyCallback;
|
||||
mMap.getMapAsync(onMapReadyCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,6 @@ import com.mapbox.mapboxsdk.annotations.Polyline;
|
||||
import com.mapbox.mapboxsdk.annotations.PolylineOptions;
|
||||
import com.mapbox.mapboxsdk.annotations.IconFactory;
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
|
||||
import com.mapbox.mapboxsdk.constants.MapboxConstants;
|
||||
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
|
||||
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
|
||||
@@ -75,7 +74,6 @@ import com.mapbox.mapboxsdk.constants.Style;
|
||||
import com.mapbox.mapboxsdk.exceptions.IconBitmapChangedException;
|
||||
import com.mapbox.mapboxsdk.exceptions.InvalidAccessTokenException;
|
||||
import com.mapbox.mapboxsdk.geometry.BoundingBox;
|
||||
import com.mapbox.mapboxsdk.geometry.CoordinateBounds;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
import com.mapbox.mapboxsdk.layers.CustomLayer;
|
||||
import com.mapbox.mapboxsdk.utils.ApiAccess;
|
||||
@@ -1305,7 +1303,7 @@ public class MapView extends FrameLayout {
|
||||
* not included in `options`.
|
||||
*
|
||||
* @param bearing Bearing in Radians
|
||||
* @param center Center Coordinate
|
||||
* @param center Center LatLng
|
||||
* @param pitch Pitch in Radians
|
||||
* @param zoom Zoom Level
|
||||
*/
|
||||
@@ -1324,7 +1322,7 @@ public class MapView extends FrameLayout {
|
||||
* not included in `options`.
|
||||
*
|
||||
* @param bearing Bearing in Radians
|
||||
* @param center Center Coordinate
|
||||
* @param center Center LatLng
|
||||
* @param duration Animation time in Nanoseconds
|
||||
* @param pitch Pitch in Radians
|
||||
* @param zoom Zoom Level
|
||||
@@ -1358,7 +1356,7 @@ public class MapView extends FrameLayout {
|
||||
* Flying animation to a specified location/zoom/bearing with automatic curve.
|
||||
*
|
||||
* @param bearing Bearing in Radians
|
||||
* @param center Center Coordinate
|
||||
* @param center Center LatLng
|
||||
* @param duration Animation time in Nanoseconds
|
||||
* @param pitch Pitch in Radians
|
||||
* @param zoom Zoom Level
|
||||
@@ -1388,70 +1386,6 @@ public class MapView extends FrameLayout {
|
||||
mNativeMapView.flyTo(bearing, center, duration, pitch, zoom);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the map's viewport to fit the given coordinate bounds.
|
||||
*
|
||||
* @param bounds The bounds that the viewport will show in its entirety.
|
||||
*/
|
||||
@UiThread
|
||||
void setVisibleCoordinateBounds(@NonNull CoordinateBounds bounds) {
|
||||
setVisibleCoordinateBounds(bounds, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the map's viewing area to fit the given coordinate bounds, optionally animating the change.
|
||||
*
|
||||
* @param bounds The bounds that the viewport will show in its entirety.
|
||||
* @param animated If true, animates the change. If false, immediately changes the map.
|
||||
*/
|
||||
@UiThread
|
||||
void setVisibleCoordinateBounds(@NonNull CoordinateBounds bounds, boolean animated) {
|
||||
setVisibleCoordinateBounds(bounds, new RectF(), animated);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the map’s viewport to fit the given coordinate bounds with additional padding at the
|
||||
* edge of the map, optionally animating the change.
|
||||
*
|
||||
* @param bounds The bounds that the viewport will show in its entirety.
|
||||
* @param padding The minimum padding (in pixels) that will be visible around the given coordinate bounds.
|
||||
* @param animated If true, animates the change. If false, immediately changes the map.
|
||||
*/
|
||||
@UiThread
|
||||
void setVisibleCoordinateBounds(@NonNull CoordinateBounds bounds, @NonNull RectF padding, boolean animated) {
|
||||
LatLng[] coordinates = {
|
||||
new LatLng(bounds.getNorthEast().getLatitude(), bounds.getSouthWest().getLongitude()),
|
||||
bounds.getSouthWest(),
|
||||
new LatLng(bounds.getSouthWest().getLatitude(), bounds.getNorthEast().getLongitude()),
|
||||
bounds.getNorthEast()
|
||||
|
||||
};
|
||||
setVisibleCoordinateBounds(coordinates, padding, animated);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the map’s viewport to fit the given coordinates, optionally some additional padding on each side
|
||||
* and animating the change.
|
||||
*
|
||||
* @param coordinates The coordinates that the viewport will show.
|
||||
* @param padding The minimum padding (in pixels) that will be visible around the given coordinate bounds.
|
||||
* @param animated If true, animates the change. If false, immediately changes the map.
|
||||
*/
|
||||
@UiThread
|
||||
void setVisibleCoordinateBounds(@NonNull LatLng[] coordinates, @NonNull RectF padding, boolean animated) {
|
||||
setVisibleCoordinateBounds(coordinates, padding, getDirection(), animated);
|
||||
}
|
||||
|
||||
private void setVisibleCoordinateBounds(LatLng[] coordinates, RectF padding, double direction, boolean animated) {
|
||||
setVisibleCoordinateBounds(coordinates, padding, direction, animated ? MapboxConstants.ANIMATION_DURATION : 0l);
|
||||
}
|
||||
|
||||
void setVisibleCoordinateBounds(LatLng[] coordinates, RectF padding, double direction, long duration) {
|
||||
mNativeMapView.setVisibleCoordinateBounds(coordinates, new RectF(padding.left / mScreenDensity,
|
||||
padding.top / mScreenDensity, padding.right / mScreenDensity, padding.bottom / mScreenDensity),
|
||||
direction, duration);
|
||||
}
|
||||
|
||||
private void adjustTopOffsetPixels() {
|
||||
int count = mAnnotations.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
@@ -1513,6 +1447,10 @@ public class MapView extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
double getScale() {
|
||||
return mNativeMapView.getScale();
|
||||
}
|
||||
|
||||
// This class handles TextureView callbacks
|
||||
private class SurfaceTextureListener implements TextureView.SurfaceTextureListener {
|
||||
|
||||
@@ -2826,8 +2764,15 @@ public class MapView extends FrameLayout {
|
||||
* @param callback The callback object that will be triggered when the map is ready to be used.
|
||||
*/
|
||||
@UiThread
|
||||
public void getMapAsync(@NonNull OnMapReadyCallback callback) {
|
||||
callback.onMapReady(mMapboxMap);
|
||||
public void getMapAsync(@NonNull final OnMapReadyCallback callback) {
|
||||
|
||||
// We need to put our callback on the message queue
|
||||
post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
callback.onMapReady(mMapboxMap);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
MapboxMap getMapboxMap() {
|
||||
|
||||
@@ -12,7 +12,6 @@ import android.support.annotation.RequiresPermission;
|
||||
import android.support.annotation.UiThread;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
|
||||
import com.mapbox.mapboxsdk.annotations.Annotation;
|
||||
@@ -24,8 +23,6 @@ import com.mapbox.mapboxsdk.annotations.PolygonOptions;
|
||||
import com.mapbox.mapboxsdk.annotations.Polyline;
|
||||
import com.mapbox.mapboxsdk.annotations.PolylineOptions;
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.camera.CameraUpdate;
|
||||
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
|
||||
import com.mapbox.mapboxsdk.constants.MapboxConstants;
|
||||
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
|
||||
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
|
||||
@@ -42,7 +39,7 @@ public class MapboxMap {
|
||||
|
||||
private MapView mMapView;
|
||||
private UiSettings mUiSettings;
|
||||
private CameraPosition mCurrentCameraPosition;
|
||||
private CameraPosition mCameraPosition;
|
||||
private String mStyleUrl;
|
||||
private List<Marker> mSelectedMarkers;
|
||||
private List<InfoWindow> mInfoWindows;
|
||||
@@ -92,7 +89,7 @@ public class MapboxMap {
|
||||
* @return The current position of the Camera.
|
||||
*/
|
||||
public final CameraPosition getCameraPosition() {
|
||||
return mCurrentCameraPosition;
|
||||
return mCameraPosition;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -115,52 +112,8 @@ public class MapboxMap {
|
||||
*/
|
||||
@UiThread
|
||||
public final void moveCamera(CameraUpdate update) {
|
||||
CameraPosition cameraPosition;
|
||||
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
|
||||
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
|
||||
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
|
||||
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
|
||||
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
|
||||
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.build();
|
||||
}else{
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.target(fromScreenLocation(new PointF(zoomUpdate.getX(),zoomUpdate.getY())))
|
||||
.build();
|
||||
}
|
||||
} else {
|
||||
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
|
||||
return;
|
||||
}
|
||||
mCurrentCameraPosition = cameraPosition;
|
||||
mMapView.jumpTo(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom);
|
||||
}
|
||||
|
||||
private float getZoom(CameraUpdateFactory.ZoomUpdate update, float currentZoom) {
|
||||
switch (update.getType()) {
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_IN:
|
||||
currentZoom++;
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_OUT:
|
||||
currentZoom--;
|
||||
if (currentZoom < 0) {
|
||||
currentZoom = 0;
|
||||
}
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO:
|
||||
currentZoom = update.getZoom();
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_BY:
|
||||
currentZoom = currentZoom + update.getZoom();
|
||||
break;
|
||||
case CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT:
|
||||
currentZoom = currentZoom + update.getZoom();
|
||||
break;
|
||||
}
|
||||
return currentZoom;
|
||||
mCameraPosition = update.getCameraPosition(this);
|
||||
mMapView.jumpTo(mCameraPosition.bearing, mCameraPosition.target, mCameraPosition.tilt, mCameraPosition.zoom);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -185,28 +138,8 @@ public class MapboxMap {
|
||||
*/
|
||||
@UiThread
|
||||
public final void easeCamera(CameraUpdate update, int durationMs, final MapboxMap.CancelableCallback callback) {
|
||||
CameraPosition cameraPosition;
|
||||
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
|
||||
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
|
||||
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
|
||||
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
|
||||
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
|
||||
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.build();
|
||||
}else{
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.target(fromScreenLocation(new PointF(zoomUpdate.getX(),zoomUpdate.getY())))
|
||||
.build();
|
||||
}
|
||||
} else {
|
||||
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
|
||||
return;
|
||||
}
|
||||
mCurrentCameraPosition = cameraPosition;
|
||||
mMapView.easeTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
|
||||
mCameraPosition = update.getCameraPosition(this);
|
||||
mMapView.easeTo(mCameraPosition.bearing, mCameraPosition.target, getDurationNano(durationMs), mCameraPosition.tilt, mCameraPosition.zoom, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -257,28 +190,8 @@ public class MapboxMap {
|
||||
*/
|
||||
@UiThread
|
||||
public final void animateCamera(CameraUpdate update, int durationMs, final MapboxMap.CancelableCallback callback) {
|
||||
CameraPosition cameraPosition;
|
||||
if (update instanceof CameraUpdateFactory.PositionCameraUpdate) {
|
||||
CameraUpdateFactory.PositionCameraUpdate positionCameraUpdate = (CameraUpdateFactory.PositionCameraUpdate) update;
|
||||
cameraPosition = new CameraPosition.Builder(positionCameraUpdate).build();
|
||||
} else if (update instanceof CameraUpdateFactory.ZoomUpdate) {
|
||||
CameraUpdateFactory.ZoomUpdate zoomUpdate = (CameraUpdateFactory.ZoomUpdate) update;
|
||||
if(zoomUpdate.getType()!= CameraUpdateFactory.ZoomUpdate.ZOOM_TO_POINT){
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.build();
|
||||
}else {
|
||||
cameraPosition = new CameraPosition.Builder(mCurrentCameraPosition)
|
||||
.zoom(getZoom(zoomUpdate, mCurrentCameraPosition.zoom))
|
||||
.target(fromScreenLocation(new PointF(zoomUpdate.getX(), zoomUpdate.getY())))
|
||||
.build();
|
||||
}
|
||||
} else {
|
||||
Log.e(MapboxConstants.TAG, "Unsupported CameraUpdate");
|
||||
return;
|
||||
}
|
||||
mCurrentCameraPosition = cameraPosition;
|
||||
mMapView.flyTo(cameraPosition.bearing, cameraPosition.target, getDurationNano(durationMs), cameraPosition.tilt, cameraPosition.zoom, callback);
|
||||
mCameraPosition = update.getCameraPosition(this);
|
||||
mMapView.flyTo(mCameraPosition.bearing, mCameraPosition.target, getDurationNano(durationMs), mCameraPosition.tilt, mCameraPosition.zoom, callback);
|
||||
}
|
||||
|
||||
// internal time layer conversion
|
||||
@@ -1123,9 +1036,13 @@ public class MapboxMap {
|
||||
mMapView.invalidateCustomLayers();
|
||||
}
|
||||
|
||||
//
|
||||
// Interfaces
|
||||
//
|
||||
MapView getMapView(){
|
||||
return mMapView;
|
||||
}
|
||||
|
||||
//
|
||||
// Interfaces
|
||||
//
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be invoked when the map is flinged.
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
import com.mapbox.mapboxsdk.geometry.ProjectedMeters;
|
||||
import com.mapbox.mapboxsdk.layers.CustomLayer;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
// Class that wraps the native methods for convenience
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.mapbox.mapboxsdk.utils.ApiAccess;
|
||||
public class SupportMapFragment extends Fragment {
|
||||
|
||||
private MapView mMap;
|
||||
private OnMapReadyCallback mMapReadyCallback;
|
||||
|
||||
public static SupportMapFragment newInstance(){
|
||||
return new SupportMapFragment();
|
||||
@@ -61,9 +60,6 @@ public class SupportMapFragment extends Fragment {
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
mMap.onResume();
|
||||
if(mMapReadyCallback!=null){
|
||||
mMapReadyCallback.onMapReady(mMap.getMapboxMap());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,6 +95,6 @@ public class SupportMapFragment extends Fragment {
|
||||
|
||||
@NonNull
|
||||
public void getMapAsync(@NonNull OnMapReadyCallback onMapReadyCallback){
|
||||
mMapReadyCallback = onMapReadyCallback;
|
||||
mMap.getMapAsync(onMapReadyCallback);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.mapbox.mapboxsdk.R;
|
||||
import com.mapbox.mapboxsdk.camera.CameraPosition;
|
||||
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
|
||||
import com.mapbox.mapboxsdk.constants.MyBearingTracking;
|
||||
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
|
||||
import com.mapbox.mapboxsdk.geometry.LatLng;
|
||||
|
||||
@@ -13,4 +13,15 @@ public class MathUtils {
|
||||
return Math.max(min, Math.min(max, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a value in specified range, returning minimum if it's below, and maximum if it's above
|
||||
* @param value Value to test
|
||||
* @param min Minimum value of range
|
||||
* @param max Maximum value of range
|
||||
* @return value if it's between min and max, min if it's below, max if it's above
|
||||
*/
|
||||
public static float clamp(float value, float min, float max) {
|
||||
return Math.max(min, Math.min(max, value));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user