Converted a few of SDK files (one package) to Kotlin (#637)

Co-authored-by: Artak Kalantarian <artak@amazon.com>
Co-authored-by: Birk Skyum <74932975+birkskyum@users.noreply.github.com>
This commit is contained in:
Artak Kalantarian
2022-12-24 11:07:20 -08:00
committed by GitHub
parent cf35b29b54
commit ccd3c60e55
16 changed files with 1062 additions and 1277 deletions

View File

@@ -1,415 +0,0 @@
package com.mapbox.mapboxsdk.camera;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.FloatRange;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Size;
import com.mapbox.mapboxsdk.R;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.utils.MathUtils;
import java.util.Arrays;
/**
* Resembles the position, angle, zoom and tilt of the user's viewpoint.
*/
public final class CameraPosition implements Parcelable {
public static final CameraPosition DEFAULT = new CameraPosition(new LatLng(), 0, 0, 0, new double[] {0, 0, 0, 0});
public static final Parcelable.Creator<CameraPosition> CREATOR =
new Parcelable.Creator<CameraPosition>() {
public CameraPosition createFromParcel(Parcel in) {
double bearing = in.readDouble();
LatLng target = in.readParcelable(LatLng.class.getClassLoader());
double tilt = in.readDouble();
double zoom = in.readDouble();
double[] padding = null;
int paddingSize = in.readInt();
if (paddingSize > 0) {
padding = new double[paddingSize];
for (int i = 0; i < paddingSize; i++) {
padding[i] = in.readDouble();
}
}
return new CameraPosition(target, zoom, tilt, bearing, padding);
}
public CameraPosition[] newArray(int size) {
return new CameraPosition[size];
}
};
/**
* Direction that the camera is pointing in, in degrees clockwise from north.
*/
@Keep
public final double bearing;
/**
* The location that the camera is pointing at.
*/
@Keep
public final LatLng target;
/**
* The angle, in degrees, of the camera angle from the nadir (directly facing the Earth).
* See {@link Builder#tilt(double)} for details of restrictions on the range of values.
*/
@Keep
public final double tilt;
/**
* Zoom level near the center of the screen. See {@link Builder#zoom(double)} for the definition of the camera's
* zoom level.
*/
@Keep
public final double zoom;
/**
* Padding in pixels. Specified in left, top, right, bottom order.
* See {@link Builder#padding(double[])} for the definition of the camera's padding.
*/
@Keep
public final double[] padding;
/**
* Constructs a CameraPosition.
*
* @param target The target location to align with the center of the screen.
* @param zoom Zoom level at target. See zoom(float) for details of restrictions.
* @param tilt The camera angle, in degrees, from the nadir (directly down). See tilt(float)
* for details of restrictions.
* @param bearing Direction that the camera is pointing in, in degrees clockwise from north.
* This value will be normalized to be within 0 degrees inclusive and 360 degrees
* exclusive.
* @throws NullPointerException if target is null
* @throws IllegalArgumentException if tilt is outside the range of 0 to 90 degrees inclusive.
* @deprecated use {@link CameraPosition#CameraPosition(LatLng, double, double, double, double[])} instead.
*/
@Deprecated
CameraPosition(LatLng target, double zoom, double tilt, double bearing) {
this(target, zoom, tilt, bearing, null);
}
/**
* Constructs a CameraPosition.
*
* @param target The target location to align with the center of the screen.
* @param zoom Zoom level at target. See zoom(float) for details of restrictions.
* @param tilt The camera angle, in degrees, from the nadir (directly down). See tilt(float)
* for details of restrictions.
* @param bearing Direction that the camera is pointing in, in degrees clockwise from north.
* This value will be normalized to be within 0 degrees inclusive and 360 degrees
* exclusive.
* @param padding Padding in pixels. Specified in left, top, right, bottom order.
* @throws NullPointerException if target is null
* @throws IllegalArgumentException if tilt is outside the range of 0 to 90 degrees inclusive.
*/
@Keep
CameraPosition(LatLng target, double zoom, double tilt, double bearing, double[] padding) {
this.target = target;
this.bearing = bearing;
this.tilt = tilt;
this.zoom = zoom;
this.padding = padding;
}
/**
* Describe the kinds of special objects contained in this Parcelable's
* marshalled representation.
*
* @return integer 0.
*/
@Override
public int describeContents() {
return 0;
}
/**
* Flatten this object in to a Parcel.
*
* @param out The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written. May be 0 or
* {@link #PARCELABLE_WRITE_RETURN_VALUE}.
*/
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeDouble(bearing);
out.writeParcelable(target, flags);
out.writeDouble(tilt);
out.writeDouble(zoom);
if (padding != null) {
int length = padding.length;
out.writeInt(length);
for (double v : padding) {
out.writeDouble(v);
}
} else {
out.writeInt(-1);
}
}
/**
* Returns a String with the camera target, zoom, bearing and tilt.
*
* @return A String with CameraPosition information.
*/
@Override
public String toString() {
return "Target: " + target + ", Zoom:" + zoom + ", Bearing:" + bearing + ", Tilt:" + tilt
+ ", Padding:" + Arrays.toString(padding);
}
/**
* Compares this {@link CameraPosition} object with another {@link CameraPosition} and
* determines if their target, zoom, tilt, and bearing match.
*
* @param o Another {@link CameraPosition} to compare with this object.
* @return True if target, zoom, tilt, and bearing match this {@link CameraPosition} object.
* Else, false.
*/
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CameraPosition cameraPosition = (CameraPosition) o;
if (target != null && !target.equals(cameraPosition.target)) {
return false;
} else if (zoom != cameraPosition.zoom) {
return false;
} else if (tilt != cameraPosition.tilt) {
return false;
} else if (bearing != cameraPosition.bearing) {
return false;
} else if (!Arrays.equals(padding, cameraPosition.padding)) {
return false;
}
return true;
}
/**
* Gives an integer which can be used as the bucket number for storing elements of the set/map.
* This bucket number is the address of the element inside the set/map. There's no guarantee
* that this hash value will be consistent between different Java implementations, or even
* between different execution runs of the same program.
*
* @return integer value you can use for storing element.
*/
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(bearing);
result = (int) (temp ^ (temp >>> 32));
result = 31 * result + (target != null ? target.hashCode() : 0);
temp = Double.doubleToLongBits(tilt);
result = 31 * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(zoom);
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + Arrays.hashCode(padding);
return result;
}
/**
* Builder for composing CameraPosition objects.
*/
public static final class Builder {
private double bearing = -1;
@Nullable
private LatLng target = null;
private double tilt = -1;
private double zoom = -1;
private double[] padding = null;
/**
* Create an empty builder.
*/
public Builder() {
super();
}
/**
* Create a builder with an existing CameraPosition data.
*
* @param previous Existing CameraPosition values to use
*/
public Builder(@Nullable CameraPosition previous) {
super();
if (previous != null) {
this.bearing = previous.bearing;
this.target = previous.target;
this.tilt = previous.tilt;
this.zoom = previous.zoom;
this.padding = previous.padding;
}
}
/**
* Create a builder with an existing CameraPosition data.
*
* @param typedArray TypedArray containing attribute values
*/
public Builder(@Nullable TypedArray typedArray) {
super();
if (typedArray != null) {
this.bearing = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraBearing, 0.0f);
double lat = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTargetLat, 0.0f);
double lng = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTargetLng, 0.0f);
this.target = new LatLng(lat, lng);
this.tilt = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTilt, 0.0f);
this.zoom = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraZoom, 0.0f);
}
}
/**
* Create a builder from an existing CameraPositionUpdate update.
*
* @param update Update containing camera options
*/
public Builder(@Nullable CameraUpdateFactory.CameraPositionUpdate update) {
super();
if (update != null) {
bearing = update.getBearing();
target = update.getTarget();
tilt = update.getTilt();
zoom = update.getZoom();
padding = update.getPadding();
}
}
/**
* Create builder from an existing CameraPositionUpdate update.
*
* @param update Update containing camera options
*/
public Builder(@Nullable CameraUpdateFactory.ZoomUpdate update) {
super();
if (update != null) {
this.zoom = update.getZoom();
}
}
/**
* Sets the direction that the camera is pointing in, in degrees clockwise from north.
*
* @param bearing Bearing
* @return this
*/
@NonNull
public Builder bearing(double bearing) {
double direction = bearing;
while (direction >= 360) {
direction -= 360;
}
while (direction < 0) {
direction += 360;
}
this.bearing = direction;
return this;
}
/**
* Sets the location where the camera is pointing at.
*
* @param location target of the camera
* @return this
*/
@NonNull
public Builder target(LatLng location) {
this.target = location;
return this;
}
/**
* Set the tilt of the camera in degrees
* <p>
* value is clamped to {@link MapboxConstants#MINIMUM_TILT} and {@link MapboxConstants#MAXIMUM_TILT}.
* </p>
*
* @param tilt Tilt value of the camera
* @return this
*/
@NonNull
public Builder tilt(@FloatRange(from = MapboxConstants.MINIMUM_TILT,
to = MapboxConstants.MAXIMUM_TILT) double tilt) {
this.tilt = MathUtils.clamp(tilt, MapboxConstants.MINIMUM_TILT, MapboxConstants.MAXIMUM_TILT);
return this;
}
/**
* Set the zoom of the camera
* <p>
* Zoom ranges from {@link MapboxConstants#MINIMUM_ZOOM} to {@link MapboxConstants#MAXIMUM_ZOOM}
* </p>
*
* @param zoom Zoom value of the camera
* @return this
*/
@NonNull
public Builder zoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM,
to = MapboxConstants.MAXIMUM_ZOOM) double zoom) {
this.zoom = zoom;
return this;
}
/**
* Padding in pixels that shifts the viewport by the specified amount.
* Applied padding is going to persist and impact following camera transformations.
* <p>
* Specified in left, top, right, bottom order.
* </p>
*
* @param padding Camera padding
* @return this
*/
@NonNull
public Builder padding(@Size(4) double[] padding) {
this.padding = padding;
return this;
}
/**
* Padding in pixels that shifts the viewport by the specified amount.
* Applied padding is going to persist and impact following camera transformations.
* <p>
* Specified in left, top, right, bottom order.
* </p>
*
* @return this
*/
@NonNull
public Builder padding(double left, double top, double right, double bottom) {
this.padding = new double[] {left, top, right, bottom};
return this;
}
/**
* Builds the CameraPosition.
*
* @return CameraPosition
*/
public CameraPosition build() {
return new CameraPosition(target, zoom, tilt, bearing, padding);
}
}
}

View File

@@ -0,0 +1,387 @@
package com.mapbox.mapboxsdk.camera
import android.content.res.TypedArray
import android.os.Parcel
import android.os.Parcelable
import androidx.annotation.FloatRange
import androidx.annotation.Keep
import androidx.annotation.Size
import com.mapbox.mapboxsdk.R
import com.mapbox.mapboxsdk.camera.CameraPosition.Builder
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory.CameraPositionUpdate
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory.ZoomUpdate
import com.mapbox.mapboxsdk.constants.MapboxConstants
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.utils.MathUtils
import java.util.Arrays
/**
* Resembles the position, angle, zoom and tilt of the user's viewpoint.
*/
class CameraPosition
/**
* Constructs a CameraPosition.
*
* @param target The target location to align with the center of the screen.
* @param zoom Zoom level at target. See zoom(float) for details of restrictions.
* @param tilt The camera angle, in degrees, from the nadir (directly down). See tilt(float)
* for details of restrictions.
* @param bearing Direction that the camera is pointing in, in degrees clockwise from north.
* This value will be normalized to be within 0 degrees inclusive and 360 degrees
* exclusive.
* @param padding Padding in pixels. Specified in left, top, right, bottom order.
* @throws NullPointerException if target is null
* @throws IllegalArgumentException if tilt is outside the range of 0 to 90 degrees inclusive.
*/ @Keep internal constructor(
/**
* The location that the camera is pointing at.
*/
@field:Keep
@JvmField
val target: LatLng?,
/**
* Zoom level near the center of the screen. See [Builder.zoom] for the definition of the camera's
* zoom level.
*/
@field:Keep
@JvmField
val zoom: Double,
/**
* The angle, in degrees, of the camera angle from the nadir (directly facing the Earth).
* See [Builder.tilt] for details of restrictions on the range of values.
*/
@field:Keep
@JvmField
val tilt: Double,
/**
* Direction that the camera is pointing in, in degrees clockwise from north.
*/
@field:Keep
@JvmField
val bearing: Double,
/**
* Padding in pixels. Specified in left, top, right, bottom order.
* See [Builder.padding] for the definition of the camera's padding.
*/
@field:Keep
@JvmField
val padding: DoubleArray?
) : Parcelable {
/**
* Constructs a CameraPosition.
*
* @param target The target location to align with the center of the screen.
* @param zoom Zoom level at target. See zoom(float) for details of restrictions.
* @param tilt The camera angle, in degrees, from the nadir (directly down). See tilt(float)
* for details of restrictions.
* @param bearing Direction that the camera is pointing in, in degrees clockwise from north.
* This value will be normalized to be within 0 degrees inclusive and 360 degrees
* exclusive.
* @throws NullPointerException if target is null
* @throws IllegalArgumentException if tilt is outside the range of 0 to 90 degrees inclusive.
*/
@Deprecated("use {@link CameraPosition#CameraPosition(LatLng, double, double, double, double[])} instead.")
internal constructor(target: LatLng?, zoom: Double, tilt: Double, bearing: Double) : this(target, zoom, tilt, bearing, null) {
}
/**
* Describe the kinds of special objects contained in this Parcelable's
* marshalled representation.
*
* @return integer 0.
*/
override fun describeContents(): Int {
return 0
}
/**
* Flatten this object in to a Parcel.
*
* @param out The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written. May be 0 or
* [.PARCELABLE_WRITE_RETURN_VALUE].
*/
override fun writeToParcel(out: Parcel, flags: Int) {
out.writeDouble(bearing)
out.writeParcelable(target, flags)
out.writeDouble(tilt)
out.writeDouble(zoom)
if (padding != null) {
val length = padding.size
out.writeInt(length)
for (v in padding) {
out.writeDouble(v)
}
} else {
out.writeInt(-1)
}
}
/**
* Returns a String with the camera target, zoom, bearing and tilt.
*
* @return A String with CameraPosition information.
*/
override fun toString(): String {
return ("Target: " + target + ", Zoom:" + zoom + ", Bearing:" + bearing + ", Tilt:" + tilt + ", Padding:" + Arrays.toString(padding))
}
/**
* Compares this [CameraPosition] object with another [CameraPosition] and
* determines if their target, zoom, tilt, and bearing match.
*
* @param other Another [CameraPosition] to compare with this object.
* @return True if target, zoom, tilt, and bearing match this [CameraPosition] object.
* Else, false.
*/
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val cameraPosition = other as CameraPosition
if (target != null && target != cameraPosition.target) {
return false
} else if (zoom != cameraPosition.zoom) {
return false
} else if (tilt != cameraPosition.tilt) {
return false
} else if (bearing != cameraPosition.bearing) {
return false
} else if (!Arrays.equals(padding, cameraPosition.padding)) {
return false
}
return true
}
/**
* Gives an integer which can be used as the bucket number for storing elements of the set/map.
* This bucket number is the address of the element inside the set/map. There's no guarantee
* that this hash value will be consistent between different Java implementations, or even
* between different execution runs of the same program.
*
* @return integer value you can use for storing element.
*/
override fun hashCode(): Int {
var result: Int
var temp: Long
temp = java.lang.Double.doubleToLongBits(bearing)
result = (temp xor (temp ushr 32)).toInt()
result = 31 * result + (target?.hashCode() ?: 0)
temp = java.lang.Double.doubleToLongBits(tilt)
result = 31 * result + (temp xor (temp ushr 32)).toInt()
temp = java.lang.Double.doubleToLongBits(zoom)
result = 31 * result + (temp xor (temp ushr 32)).toInt()
result = 31 * result + Arrays.hashCode(padding)
return result
}
/**
* Builder for composing CameraPosition objects.
*/
class Builder {
private var bearing = -1.0
private var target: LatLng? = null
private var tilt = -1.0
private var zoom = -1.0
private var padding: DoubleArray? = null
/**
* Create an empty builder.
*/
constructor() : super() {}
/**
* Create a builder with an existing CameraPosition data.
*
* @param previous Existing CameraPosition values to use
*/
constructor(previous: CameraPosition?) : super() {
if (previous != null) {
bearing = previous.bearing
target = previous.target
tilt = previous.tilt
zoom = previous.zoom
padding = previous.padding
}
}
/**
* Create a builder with an existing CameraPosition data.
*
* @param typedArray TypedArray containing attribute values
*/
constructor(typedArray: TypedArray?) : super() {
if (typedArray != null) {
bearing = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraBearing, 0.0f).toDouble()
val lat = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTargetLat, 0.0f).toDouble()
val lng = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTargetLng, 0.0f).toDouble()
target = LatLng(lat, lng)
tilt = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraTilt, 0.0f).toDouble()
zoom = typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraZoom, 0.0f).toDouble()
}
}
/**
* Create a builder from an existing CameraPositionUpdate update.
*
* @param update Update containing camera options
*/
constructor(update: CameraPositionUpdate?) : super() {
if (update != null) {
bearing = update.bearing
target = update.target
tilt = update.tilt
zoom = update.zoom
padding = update.padding
}
}
/**
* Create builder from an existing CameraPositionUpdate update.
*
* @param update Update containing camera options
*/
constructor(update: ZoomUpdate?) : super() {
if (update != null) {
zoom = update.zoom
}
}
/**
* Sets the direction that the camera is pointing in, in degrees clockwise from north.
*
* @param bearing Bearing
* @return this
*/
fun bearing(bearing: Double): Builder {
var direction = bearing
while (direction >= 360) {
direction -= 360.0
}
while (direction < 0) {
direction += 360.0
}
this.bearing = direction
return this
}
/**
* Sets the location where the camera is pointing at.
*
* @param location target of the camera
* @return this
*/
fun target(location: LatLng?): Builder {
target = location
return this
}
/**
* Set the tilt of the camera in degrees
*
*
* value is clamped to [MapboxConstants.MINIMUM_TILT] and [MapboxConstants.MAXIMUM_TILT].
*
*
* @param tilt Tilt value of the camera
* @return this
*/
fun tilt(@FloatRange(from = MapboxConstants.MINIMUM_TILT, to = MapboxConstants.MAXIMUM_TILT) tilt: Double): Builder {
this.tilt = MathUtils.clamp(tilt, MapboxConstants.MINIMUM_TILT, MapboxConstants.MAXIMUM_TILT)
return this
}
/**
* Set the zoom of the camera
*
*
* Zoom ranges from [MapboxConstants.MINIMUM_ZOOM] to [MapboxConstants.MAXIMUM_ZOOM]
*
*
* @param zoom Zoom value of the camera
* @return this
*/
fun zoom(@FloatRange(from = MapboxConstants.MINIMUM_ZOOM.toDouble(), to = MapboxConstants.MAXIMUM_ZOOM.toDouble()) zoom: Double): Builder {
this.zoom = zoom
return this
}
/**
* Padding in pixels that shifts the viewport by the specified amount.
* Applied padding is going to persist and impact following camera transformations.
*
*
* Specified in left, top, right, bottom order.
*
*
* @param padding Camera padding
* @return this
*/
fun padding(@Size(4) padding: DoubleArray?): Builder {
this.padding = padding
return this
}
/**
* Padding in pixels that shifts the viewport by the specified amount.
* Applied padding is going to persist and impact following camera transformations.
*
*
* Specified in left, top, right, bottom order.
*
*
* @return this
*/
fun padding(left: Double, top: Double, right: Double, bottom: Double): Builder {
padding = doubleArrayOf(left, top, right, bottom)
return this
}
/**
* Builds the CameraPosition.
*
* @return CameraPosition
*/
fun build(): CameraPosition {
return CameraPosition(target, zoom, tilt, bearing, padding)
}
}
companion object {
@JvmField
val DEFAULT = CameraPosition(LatLng(), 0.0, 0.0, 0.0, doubleArrayOf(0.0, 0.0, 0.0, 0.0))
@JvmField
val CREATOR: Parcelable.Creator<CameraPosition> = object : Parcelable.Creator<CameraPosition> {
override fun createFromParcel(`in`: Parcel): CameraPosition {
val bearing = `in`.readDouble()
val target = `in`.readParcelable<LatLng>(LatLng::class.java.classLoader)
val tilt = `in`.readDouble()
val zoom = `in`.readDouble()
var padding: DoubleArray? = null
val paddingSize = `in`.readInt()
if (paddingSize > 0) {
padding = DoubleArray(paddingSize)
for (i in 0 until paddingSize) {
padding[i] = `in`.readDouble()
}
}
return CameraPosition(target, zoom, tilt, bearing, padding)
}
override fun newArray(size: Int): Array<CameraPosition?> {
return arrayOfNulls(size)
}
}
}
}

View File

@@ -1,23 +0,0 @@
package com.mapbox.mapboxsdk.camera;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapbox.mapboxsdk.maps.MapboxMap;
/**
* Interface definition for camera updates.
*/
public interface CameraUpdate {
/**
* Get the camera position from the camera update.
*
* @param mapboxMap Map object to build the position from
* @return the camera position from the implementing camera update
*/
@Nullable
CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap);
}

View File

@@ -0,0 +1,16 @@
package com.mapbox.mapboxsdk.camera
import com.mapbox.mapboxsdk.maps.MapboxMap
/**
* Interface definition for camera updates.
*/
interface CameraUpdate {
/**
* Get the camera position from the camera update.
*
* @param mapboxMap Map object to build the position from
* @return the camera position from the implementing camera update
*/
fun getCameraPosition(mapboxMap: MapboxMap): CameraPosition?
}

View File

@@ -1,638 +0,0 @@
package com.mapbox.mapboxsdk.camera;
import android.graphics.Point;
import android.graphics.PointF;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.Projection;
import com.mapbox.mapboxsdk.maps.UiSettings;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
/**
* Factory for creating CameraUpdate objects.
*/
public final 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
*/
public static CameraUpdate newCameraPosition(@NonNull CameraPosition cameraPosition) {
return new CameraPositionUpdate(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt,
cameraPosition.zoom, cameraPosition.padding);
}
/**
* 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 Target location to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLng(@NonNull LatLng latLng) {
return new CameraPositionUpdate(-1, latLng, -1, -1, null);
}
/**
* Returns a CameraUpdate that transforms the camera such that the specified
* latitude/longitude bounds are centered on screen at the greatest possible zoom level while maintaining
* current camera position bearing and tilt values.
* <p>
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
* </p>
*
* @param bounds Bounds to match Camera position with
* @param padding Padding added to the bounds
* @return CameraUpdate Final Camera Position
*/
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 while using
* provided bearing and tilt values.
* <p>
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
* </p>
*
* @param bounds Bounds to match Camera position with
* @param bearing Bearing to take in account when generating the bounds
* @param tilt Tilt to take in account when generating the bounds
* @param padding Padding added to the bounds
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, double bearing, double tilt, int padding) {
return newLatLngBounds(bounds, bearing, tilt, 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 while maintaining
* current camera position bearing and tilt values.
* <p>
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
* </p>
*
* @param bounds Bounds to base the Camera position out of
* @param paddingLeft Padding left of the bounds
* @param paddingTop Padding top of the bounds
* @param paddingRight Padding right of the bounds
* @param paddingBottom Padding bottom of the bounds
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, int paddingLeft, int paddingTop,
int paddingRight, int paddingBottom) {
return new CameraBoundsUpdate(bounds, null, null, paddingLeft, paddingTop, paddingRight, paddingBottom);
}
/**
* Returns a CameraUpdate that transforms the camera such that the specified
* latitude/longitude bounds are centered on screen at the greatest possible zoom level while using
* provided bearing and tilt values.
* <p>
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
* </p>
*
* @param bounds Bounds to base the Camera position out of
* @param bearing Bearing to take in account when generating the bounds
* @param tilt Tilt to take in account when generating the bounds
* @param paddingLeft Padding left of the bounds
* @param paddingTop Padding top of the bounds
* @param paddingRight Padding right of the bounds
* @param paddingBottom Padding bottom of the bounds
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLngBounds(@NonNull LatLngBounds bounds, double bearing, double tilt,
int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) {
return new CameraBoundsUpdate(bounds, bearing, tilt, paddingLeft, paddingTop, paddingRight, paddingBottom);
}
/**
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude
* specified by a LatLng object taking the specified padding into account.
*
* @param latLng Target location to change to
* @param zoom Zoom level to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLngZoom(@NonNull LatLng latLng, double zoom) {
return new CameraPositionUpdate(-1, latLng, -1, zoom, null);
}
/**
* 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.
* Applied padding is going to persist and impact following camera transformations.
*
* @param latLng Target location to change to
* @param left Left padding
* @param top Top padding
* @param right Right padding
* @param bottom Bottom padding
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate newLatLngPadding(@NonNull LatLng latLng,
double left, double top, double right, double bottom) {
return new CameraPositionUpdate(-1, latLng, -1, -1, new double[] {left, top, right, bottom});
}
/**
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
*
* @param amount Amount of zoom level to change with
* @param focus Focus point of zoom
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate zoomBy(double 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 Amount of zoom level to change with
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate zoomBy(double 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 CameraUpdate Final Camera Position
*/
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 CameraUpdate Final Camera Position
*/
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 Zoom level to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate zoomTo(double zoom) {
return new ZoomUpdate(ZoomUpdate.ZOOM_TO, zoom);
}
/**
* Returns a CameraUpdate that moves the camera viewpoint to a particular bearing.
*
* @param bearing Bearing to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate bearingTo(double bearing) {
return new CameraPositionUpdate(bearing, null, -1, -1, null);
}
/**
* Returns a CameraUpdate that moves the camera viewpoint to a particular tilt.
*
* @param tilt Tilt to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate tiltTo(double tilt) {
return new CameraPositionUpdate(-1, null, tilt, -1, null);
}
/**
* Returns a CameraUpdate that when animated changes the camera padding.
* Applied padding is going to persist and impact following camera transformations.
* <p>
* Specified in left, top, right, bottom order.
* </p>
*
* @param padding Padding to change to
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate paddingTo(double[] padding) {
return new CameraPositionUpdate(-1, null, -1, -1, padding);
}
/**
* Returns a CameraUpdate that when animated changes the camera padding.
* Applied padding is going to persist and impact following camera transformations.
* <p>
* Specified in left, top, right, bottom order.
* </p>
*
* @return CameraUpdate Final Camera Position
*/
public static CameraUpdate paddingTo(double left, double top, double right, double bottom) {
return paddingTo(new double[] {left, top, right, bottom});
}
//
// CameraUpdate types
//
static final class CameraPositionUpdate implements CameraUpdate {
private final double bearing;
private final LatLng target;
private final double tilt;
private final double zoom;
private final double[] padding;
CameraPositionUpdate(double bearing, LatLng target, double tilt, double zoom, double[] padding) {
this.bearing = bearing;
this.target = target;
this.tilt = tilt;
this.zoom = zoom;
this.padding = padding;
}
public LatLng getTarget() {
return target;
}
public double getBearing() {
return bearing;
}
public double getTilt() {
return tilt;
}
public double getZoom() {
return zoom;
}
public double[] getPadding() {
return padding;
}
@Override
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
if (target == null) {
CameraPosition previousPosition = mapboxMap.getCameraPosition();
return new CameraPosition.Builder(this)
.target(previousPosition.target)
.build();
}
return new CameraPosition.Builder(this).build();
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CameraPositionUpdate that = (CameraPositionUpdate) o;
if (Double.compare(that.bearing, bearing) != 0) {
return false;
}
if (Double.compare(that.tilt, tilt) != 0) {
return false;
}
if (Double.compare(that.zoom, zoom) != 0) {
return false;
}
if (target != null ? !target.equals(that.target) : that.target != null) {
return false;
}
return Arrays.equals(padding, that.padding);
}
@Override
public int hashCode() {
int result;
long temp;
temp = Double.doubleToLongBits(bearing);
result = (int) (temp ^ (temp >>> 32));
result = 31 * result + (target != null ? target.hashCode() : 0);
temp = Double.doubleToLongBits(tilt);
result = 31 * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(zoom);
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + Arrays.hashCode(padding);
return result;
}
@Override
public String toString() {
return "CameraPositionUpdate{"
+ "bearing=" + bearing
+ ", target=" + target
+ ", tilt=" + tilt
+ ", zoom=" + zoom
+ ", padding=" + Arrays.toString(padding)
+ '}';
}
}
static final class CameraBoundsUpdate implements CameraUpdate {
private final LatLngBounds bounds;
private final int[] padding;
private final Double bearing;
private final Double tilt;
CameraBoundsUpdate(LatLngBounds bounds, Double bearing, Double tilt, int[] padding) {
this.bounds = bounds;
this.padding = padding;
this.bearing = bearing;
this.tilt = tilt;
}
CameraBoundsUpdate(LatLngBounds bounds, Double bearing, Double tilt, int paddingLeft,
int paddingTop, int paddingRight, int paddingBottom) {
this(bounds, bearing, tilt, new int[] {paddingLeft, paddingTop, paddingRight, paddingBottom});
}
public LatLngBounds getBounds() {
return bounds;
}
public int[] getPadding() {
return padding;
}
@Override
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
if (bearing == null && tilt == null) {
// use current camera position tilt and bearing
return mapboxMap.getCameraForLatLngBounds(bounds, padding);
} else {
// use provided tilt and bearing
assert bearing != null;
assert tilt != null;
return mapboxMap.getCameraForLatLngBounds(bounds, padding, bearing, tilt);
}
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CameraBoundsUpdate that = (CameraBoundsUpdate) o;
if (!bounds.equals(that.bounds)) {
return false;
}
return Arrays.equals(padding, that.padding);
}
@Override
public int hashCode() {
int result = bounds.hashCode();
result = 31 * result + Arrays.hashCode(padding);
return result;
}
@Override
public String toString() {
return "CameraBoundsUpdate{"
+ "bounds=" + bounds
+ ", padding=" + Arrays.toString(padding)
+ '}';
}
}
static final class CameraMoveUpdate implements CameraUpdate {
private float x;
private float y;
CameraMoveUpdate(float x, float y) {
this.x = x;
this.y = y;
}
@Override
public CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap) {
UiSettings uiSettings = mapboxMap.getUiSettings();
Projection projection = mapboxMap.getProjection();
// Calculate the new center point
float viewPortWidth = uiSettings.getWidth();
float viewPortHeight = uiSettings.getHeight();
int[] padding = mapboxMap.getPadding();
// we inverse the map padding, is reapplied when using moveTo/easeTo or animateTo
PointF targetPoint = new PointF(
(viewPortWidth - padding[0] + padding[1]) / 2 + x,
(viewPortHeight + padding[1] - padding[3]) / 2 + y
);
LatLng latLng = projection.fromScreenLocation(targetPoint);
CameraPosition previousPosition = mapboxMap.getCameraPosition();
CameraPosition position =
new CameraPosition.Builder()
.target(latLng)
.zoom(previousPosition.zoom)
.tilt(previousPosition.tilt)
.bearing(previousPosition.bearing)
.build();
return position;
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CameraMoveUpdate that = (CameraMoveUpdate) o;
if (Float.compare(that.x, x) != 0) {
return false;
}
return Float.compare(that.y, y) == 0;
}
@Override
public int hashCode() {
int result = (x != +0.0f ? Float.floatToIntBits(x) : 0);
result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0);
return result;
}
@Override
public String toString() {
return "CameraMoveUpdate{"
+ "x=" + x
+ ", y=" + y
+ '}';
}
}
static final class ZoomUpdate implements CameraUpdate {
@IntDef( {ZOOM_IN, ZOOM_OUT, ZOOM_BY, ZOOM_TO, ZOOM_TO_POINT})
@Retention(RetentionPolicy.SOURCE)
@interface Type {
}
static final int ZOOM_IN = 0;
static final int ZOOM_OUT = 1;
static final int ZOOM_BY = 2;
static final int ZOOM_TO = 3;
static final int ZOOM_TO_POINT = 4;
@Type
private final int type;
private final double zoom;
private float x;
private float y;
ZoomUpdate(@Type int type) {
this.type = type;
this.zoom = 0;
}
ZoomUpdate(@Type int type, double zoom) {
this.type = type;
this.zoom = zoom;
}
ZoomUpdate(double zoom, float x, float y) {
this.type = ZOOM_TO_POINT;
this.zoom = zoom;
this.x = x;
this.y = y;
}
public double getZoom() {
return zoom;
}
@Type
public int getType() {
return type;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
double transformZoom(double 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.getProjection().fromScreenLocation(new PointF(getX(), getY())))
.build();
}
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ZoomUpdate that = (ZoomUpdate) o;
if (type != that.type) {
return false;
}
if (Double.compare(that.zoom, zoom) != 0) {
return false;
}
if (Float.compare(that.x, x) != 0) {
return false;
}
return Float.compare(that.y, y) == 0;
}
@Override
public int hashCode() {
int result;
long temp;
result = type;
temp = Double.doubleToLongBits(zoom);
result = 31 * result + (int) (temp ^ (temp >>> 32));
result = 31 * result + (x != +0.0f ? Float.floatToIntBits(x) : 0);
result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0);
return result;
}
@Override
public String toString() {
return "ZoomUpdate{"
+ "type=" + type
+ ", zoom=" + zoom
+ ", x=" + x
+ ", y=" + y
+ '}';
}
}
}

View File

@@ -0,0 +1,510 @@
package com.mapbox.mapboxsdk.camera
import android.graphics.Point
import android.graphics.PointF
import androidx.annotation.IntDef
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.geometry.LatLngBounds
import com.mapbox.mapboxsdk.maps.MapboxMap
import timber.log.Timber
import java.lang.Double.min
import java.util.Arrays
/**
* Factory for creating CameraUpdate objects.
*/
object CameraUpdateFactory {
/**
* Returns a CameraUpdate that moves the camera to a specified CameraPosition.
*
* @param cameraPosition Camera Position to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newCameraPosition(cameraPosition: CameraPosition): CameraUpdate {
return CameraPositionUpdate(cameraPosition.bearing, cameraPosition.target, cameraPosition.tilt, cameraPosition.zoom, cameraPosition.padding)
}
/**
* 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 Target location to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLng(latLng: LatLng): CameraUpdate {
return CameraPositionUpdate(-1.0, latLng, -1.0, -1.0, null)
}
/**
* Returns a CameraUpdate that transforms the camera such that the specified
* latitude/longitude bounds are centered on screen at the greatest possible zoom level while maintaining
* current camera position bearing and tilt values.
*
*
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
*
*
* @param bounds Bounds to match Camera position with
* @param padding Padding added to the bounds
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngBounds(bounds: LatLngBounds, padding: Int): CameraUpdate {
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 while using
* provided bearing and tilt values.
*
*
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
*
*
* @param bounds Bounds to match Camera position with
* @param bearing Bearing to take in account when generating the bounds
* @param tilt Tilt to take in account when generating the bounds
* @param padding Padding added to the bounds
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngBounds(bounds: LatLngBounds, bearing: Double, tilt: Double, padding: Int): CameraUpdate {
return newLatLngBounds(bounds, bearing, tilt, 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 while maintaining
* current camera position bearing and tilt values.
*
*
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
*
*
* @param bounds Bounds to base the Camera position out of
* @param paddingLeft Padding left of the bounds
* @param paddingTop Padding top of the bounds
* @param paddingRight Padding right of the bounds
* @param paddingBottom Padding bottom of the bounds
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngBounds(bounds: LatLngBounds, paddingLeft: Int, paddingTop: Int, paddingRight: Int, paddingBottom: Int): CameraUpdate {
return CameraBoundsUpdate(bounds, null, null, paddingLeft, paddingTop, paddingRight, paddingBottom)
}
/**
* Returns a CameraUpdate that transforms the camera such that the specified
* latitude/longitude bounds are centered on screen at the greatest possible zoom level while using
* provided bearing and tilt values.
*
*
* You can specify padding, in order to inset the bounding box from the map view's edges.
* The padding will not persist and impact following camera transformations.
*
*
* @param bounds Bounds to base the Camera position out of
* @param bearing Bearing to take in account when generating the bounds
* @param tilt Tilt to take in account when generating the bounds
* @param paddingLeft Padding left of the bounds
* @param paddingTop Padding top of the bounds
* @param paddingRight Padding right of the bounds
* @param paddingBottom Padding bottom of the bounds
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngBounds(bounds: LatLngBounds, bearing: Double, tilt: Double, paddingLeft: Int, paddingTop: Int, paddingRight: Int, paddingBottom: Int): CameraUpdate {
return CameraBoundsUpdate(bounds, bearing, tilt, paddingLeft, paddingTop, paddingRight, paddingBottom)
}
/**
* Returns a CameraUpdate that moves the center of the screen to a latitude and longitude
* specified by a LatLng object taking the specified padding into account.
*
* @param latLng Target location to change to
* @param zoom Zoom level to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngZoom(latLng: LatLng, zoom: Double): CameraUpdate {
return CameraPositionUpdate(-1.0, latLng, -1.0, zoom, null)
}
/**
* 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.
* Applied padding is going to persist and impact following camera transformations.
*
* @param latLng Target location to change to
* @param left Left padding
* @param top Top padding
* @param right Right padding
* @param bottom Bottom padding
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun newLatLngPadding(latLng: LatLng, left: Double, top: Double, right: Double, bottom: Double): CameraUpdate {
return CameraPositionUpdate(-1.0, latLng, -1.0, -1.0, doubleArrayOf(left, top, right, bottom))
}
/**
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
*
* @param amount Amount of zoom level to change with
* @param focus Focus point of zoom
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun zoomBy(amount: Double, focus: Point): CameraUpdate {
return ZoomUpdate(amount, focus.x.toFloat(), focus.y.toFloat())
}
/**
* Returns a CameraUpdate that shifts the zoom level of the current camera viewpoint.
*
* @param amount Amount of zoom level to change with
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun zoomBy(amount: Double): CameraUpdate {
return 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 CameraUpdate Final Camera Position
*/
@JvmStatic
fun zoomIn(): CameraUpdate {
return 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 CameraUpdate Final Camera Position
*/
@JvmStatic
fun zoomOut(): CameraUpdate {
return ZoomUpdate(ZoomUpdate.ZOOM_OUT)
}
/**
* Returns a CameraUpdate that moves the camera viewpoint to a particular zoom level.
*
* @param zoom Zoom level to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun zoomTo(zoom: Double): CameraUpdate {
return ZoomUpdate(ZoomUpdate.ZOOM_TO, zoom)
}
/**
* Returns a CameraUpdate that moves the camera viewpoint to a particular bearing.
*
* @param bearing Bearing to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun bearingTo(bearing: Double): CameraUpdate {
return CameraPositionUpdate(bearing, null, -1.0, -1.0, null)
}
/**
* Returns a CameraUpdate that moves the camera viewpoint to a particular tilt.
*
* @param tilt Tilt to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun tiltTo(tilt: Double): CameraUpdate {
return CameraPositionUpdate(-1.0, null, tilt, -1.0, null)
}
/**
* Returns a CameraUpdate that when animated changes the camera padding.
* Applied padding is going to persist and impact following camera transformations.
*
*
* Specified in left, top, right, bottom order.
*
*
* @param padding Padding to change to
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun paddingTo(padding: DoubleArray?): CameraUpdate {
return CameraPositionUpdate(-1.0, null, -1.0, -1.0, padding)
}
/**
* Returns a CameraUpdate that when animated changes the camera padding.
* Applied padding is going to persist and impact following camera transformations.
*
*
* Specified in left, top, right, bottom order.
*
*
* @return CameraUpdate Final Camera Position
*/
@JvmStatic
fun paddingTo(left: Double, top: Double, right: Double, bottom: Double): CameraUpdate {
return paddingTo(doubleArrayOf(left, top, right, bottom))
}
//
// CameraUpdate types
//
class CameraPositionUpdate(val bearing: Double, val target: LatLng?, val tilt: Double, val zoom: Double, val padding: DoubleArray?) : CameraUpdate {
override fun getCameraPosition(mapboxMap: MapboxMap): CameraPosition {
if (target == null) {
val previousPosition = mapboxMap.cameraPosition
return CameraPosition.Builder(this).target(previousPosition.target).build()
}
return CameraPosition.Builder(this).build()
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val that = other as CameraPositionUpdate
if (java.lang.Double.compare(that.bearing, bearing) != 0) {
return false
}
if (java.lang.Double.compare(that.tilt, tilt) != 0) {
return false
}
if (java.lang.Double.compare(that.zoom, zoom) != 0) {
return false
}
return if (if (target != null) target != that.target else that.target != null) {
false
} else {
Arrays.equals(padding, that.padding)
}
}
override fun hashCode(): Int {
var result: Int
var temp: Long
temp = java.lang.Double.doubleToLongBits(bearing)
result = (temp xor (temp ushr 32)).toInt()
result = 31 * result + (target?.hashCode() ?: 0)
temp = java.lang.Double.doubleToLongBits(tilt)
result = 31 * result + (temp xor (temp ushr 32)).toInt()
temp = java.lang.Double.doubleToLongBits(zoom)
result = 31 * result + (temp xor (temp ushr 32)).toInt()
result = 31 * result + Arrays.hashCode(padding)
return result
}
override fun toString(): String {
return ("CameraPositionUpdate{" + "bearing=" + bearing + ", target=" + target + ", tilt=" + tilt + ", zoom=" + zoom + ", padding=" + Arrays.toString(padding) + '}')
}
}
internal class CameraBoundsUpdate(val bounds: LatLngBounds, private val bearing: Double?, private val tilt: Double?, val padding: IntArray) : CameraUpdate {
constructor(bounds: LatLngBounds, bearing: Double?, tilt: Double?, paddingLeft: Int, paddingTop: Int, paddingRight: Int, paddingBottom: Int) : this(
bounds,
bearing,
tilt,
intArrayOf(paddingLeft, paddingTop, paddingRight, paddingBottom)
) {
}
override fun getCameraPosition(mapboxMap: MapboxMap): CameraPosition? {
return if (bearing == null && tilt == null) {
// use current camera position tilt and bearing
mapboxMap.getCameraForLatLngBounds(bounds, padding)
} else {
// use provided tilt and bearing
assert(bearing != null)
assert(tilt != null)
mapboxMap.getCameraForLatLngBounds(bounds, padding, bearing!!, tilt!!)
}
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val that = other as CameraBoundsUpdate
return if (bounds != that.bounds) {
false
} else {
padding.contentEquals(that.padding)
}
}
override fun hashCode(): Int {
var result = bounds.hashCode()
result = 31 * result + Arrays.hashCode(padding)
return result
}
override fun toString(): String {
return ("CameraBoundsUpdate{" + "bounds=" + bounds + ", padding=" + Arrays.toString(padding) + '}')
}
}
internal class CameraMoveUpdate(private val x: Float, private val y: Float) : CameraUpdate {
override fun getCameraPosition(mapboxMap: MapboxMap): CameraPosition {
val uiSettings = mapboxMap.uiSettings
val projection = mapboxMap.projection
// Calculate the new center point
val viewPortWidth = uiSettings.width
val viewPortHeight = uiSettings.height
val padding = mapboxMap.padding
// we inverse the map padding, is reapplied when using moveTo/easeTo or animateTo
val targetPoint = PointF((viewPortWidth - padding[0] + padding[1]) / 2 + x, (viewPortHeight + padding[1] - padding[3]) / 2 + y)
val latLng = projection.fromScreenLocation(targetPoint)
val previousPosition = mapboxMap.cameraPosition
return CameraPosition.Builder().target(latLng).zoom(previousPosition.zoom).tilt(previousPosition.tilt).bearing(previousPosition.bearing).build()
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val that = other as CameraMoveUpdate
return if (java.lang.Float.compare(that.x, x) != 0) {
false
} else {
that.y.compareTo(y) == 0
}
}
override fun hashCode(): Int {
var result = if (x != +0.0f) java.lang.Float.floatToIntBits(x) else 0
result = 31 * result + if (y != +0.0f) java.lang.Float.floatToIntBits(y) else 0
return result
}
override fun toString(): String {
return ("CameraMoveUpdate{" + "x=" + x + ", y=" + y + '}')
}
}
class ZoomUpdate : CameraUpdate {
@IntDef(ZOOM_IN, ZOOM_OUT, ZOOM_BY, ZOOM_TO, ZOOM_TO_POINT)
@Retention(AnnotationRetention.SOURCE)
internal annotation class Type
@get:Type
@Type
val type: Int
val zoom: Double
var x = 0f
private set
var y = 0f
private set
constructor(@Type type: Int) {
this.type = type
zoom = 0.0
}
constructor(@Type type: Int, zoom: Double) {
this.type = type
this.zoom = zoom
}
constructor(zoom: Double, x: Float, y: Float) {
type = ZOOM_TO_POINT
this.zoom = zoom
this.x = x
this.y = y
}
private fun transformZoom(currentZoomArg: Double): Double {
return when (type) {
ZOOM_IN -> currentZoomArg + 1
ZOOM_OUT -> {
min(currentZoomArg - 1, 0.0)
}
ZOOM_TO -> zoom
ZOOM_BY, ZOOM_TO_POINT -> currentZoomArg + zoom
else -> {
Timber.e("Unprocessed when branch")
4.0
}
}
}
override fun getCameraPosition(mapboxMap: MapboxMap): CameraPosition {
val cameraPosition = mapboxMap.cameraPosition
return if (type != ZOOM_TO_POINT) {
CameraPosition.Builder(cameraPosition).zoom(transformZoom(cameraPosition.zoom)).build()
} else {
CameraPosition.Builder(cameraPosition).zoom(transformZoom(cameraPosition.zoom)).target(mapboxMap.projection.fromScreenLocation(PointF(x, y))).build()
}
}
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (other == null || javaClass != other.javaClass) {
return false
}
val that = other as ZoomUpdate
if (type != that.type) {
return false
}
if (java.lang.Double.compare(that.zoom, zoom) != 0) {
return false
}
return if (java.lang.Float.compare(that.x, x) != 0) {
false
} else {
that.y.compareTo(y) == 0
}
}
override fun hashCode(): Int {
var result: Int
val temp: Long
result = type
temp = java.lang.Double.doubleToLongBits(zoom)
result = 31 * result + (temp xor (temp ushr 32)).toInt()
result = 31 * result + if (x != +0.0f) java.lang.Float.floatToIntBits(x) else 0
result = 31 * result + if (y != +0.0f) java.lang.Float.floatToIntBits(y) else 0
return result
}
override fun toString(): String {
return ("ZoomUpdate{" + "type=" + type + ", zoom=" + zoom + ", x=" + x + ", y=" + y + '}')
}
companion object {
const val ZOOM_IN = 0
const val ZOOM_OUT = 1
const val ZOOM_BY = 2
const val ZOOM_TO = 3
const val ZOOM_TO_POINT = 4
}
}
}

View File

@@ -1,4 +1,4 @@
/**
* Contains the Mapbox Maps Android Camera API classes.
*/
package com.mapbox.mapboxsdk.camera;
package com.mapbox.mapboxsdk.camera

View File

@@ -8,10 +8,10 @@ import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import timber.log.Timber;
import static com.mapbox.mapboxsdk.location.engine.Utils.isBetterLocation;
@@ -20,7 +20,7 @@ import static com.mapbox.mapboxsdk.location.engine.Utils.isBetterLocation;
* <p>
* Note: fusion will not work in background mode.
*/
class MapboxFusedLocationEngineImpl extends AndroidLocationEngineImpl {
public class MapboxFusedLocationEngineImpl extends AndroidLocationEngineImpl {
private static final String TAG = "MapboxLocationEngine";
MapboxFusedLocationEngineImpl(@NonNull Context context) {
@@ -121,17 +121,17 @@ class MapboxFusedLocationEngineImpl extends AndroidLocationEngineImpl {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d(TAG, "onStatusChanged: " + provider);
Timber.d( "onStatusChanged: " + provider);
}
@Override
public void onProviderEnabled(String provider) {
Log.d(TAG, "onProviderEnabled: " + provider);
Timber.d( "onProviderEnabled: " + provider);
}
@Override
public void onProviderDisabled(String provider) {
Log.d(TAG, "onProviderDisabled: " + provider);
Timber.d("onProviderDisabled: " + provider);
}
}
}