summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-03-03 13:28:01 +0100
committerTobrun <tobrun@mapbox.com>2016-03-03 13:28:01 +0100
commitbc63d7522713c941a4d924a739988de98294192c (patch)
tree12f66d099ddabfeaf903d11fffc3d91fa8e79d85 /platform
parente2da260a8ee0dd0b213ec0e30db2c6e3188c7c9b (diff)
downloadqtlocation-mapboxgl-bc63d7522713c941a4d924a739988de98294192c.tar.gz
[android] #3867 - performance improvement for invalidating the camera
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java56
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraUpdateFactory.java20
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java22
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java7
-rwxr-xr-xplatform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java6
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java6
-rwxr-xr-xplatform/android/src/jni.cpp25
7 files changed, 85 insertions, 57 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
index ec2f0eb316..e66c9ee572 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraPosition.java
@@ -16,10 +16,10 @@ public final class CameraPosition implements Parcelable {
public static final Parcelable.Creator<CameraPosition> CREATOR
= new Parcelable.Creator<CameraPosition>() {
public CameraPosition createFromParcel(Parcel in) {
- float bearing = in.readFloat();
+ double bearing = in.readDouble();
LatLng target = in.readParcelable(LatLng.class.getClassLoader());
- float tilt = in.readFloat();
- float zoom = in.readFloat();
+ double tilt = in.readDouble();
+ double zoom = in.readDouble();
return new CameraPosition(target, zoom, tilt, bearing);
}
@@ -32,7 +32,7 @@ public final class CameraPosition implements Parcelable {
/**
* Direction that the camera is pointing in, in degrees clockwise from north.
*/
- public final float bearing;
+ public final double bearing;
/**
* The location that the camera is pointing at.
@@ -42,12 +42,12 @@ public final class CameraPosition implements Parcelable {
/**
* The angle, in degrees, of the camera angle from the nadir (directly facing the Earth). See tilt(float) for details of restrictions on the range of values.
*/
- public final float tilt;
+ public final double tilt;
/**
* Zoom level near the center of the screen. See zoom(float) for the definition of the camera's zoom level.
*/
- public final float zoom;
+ public final double zoom;
/**
* Constructs a CameraPosition.
@@ -59,7 +59,7 @@ public final class CameraPosition implements Parcelable {
* @throws NullPointerException if target is null
* @throws IllegalArgumentException if tilt is outside the range of 0 to 90 degrees inclusive.
*/
- CameraPosition(LatLng target, float zoom, float tilt, float bearing) {
+ CameraPosition(LatLng target, double zoom, double tilt, double bearing) {
this.target = target;
this.bearing = bearing;
this.tilt = tilt;
@@ -73,10 +73,10 @@ public final class CameraPosition implements Parcelable {
@Override
public void writeToParcel(Parcel out, int flags) {
- out.writeFloat(bearing);
+ out.writeDouble(bearing);
out.writeParcelable(target, flags);
- out.writeFloat(tilt);
- out.writeFloat(zoom);
+ out.writeDouble(tilt);
+ out.writeDouble(zoom);
}
@Override
@@ -119,10 +119,10 @@ public final class CameraPosition implements Parcelable {
*/
public static final class Builder {
- private float bearing = -1;
+ private double bearing = -1;
private LatLng target = null;
- private float tilt = -1;
- private float zoom = -1;
+ private double tilt = -1;
+ private double zoom = -1;
private boolean isRadiant;
/**
@@ -201,15 +201,31 @@ public final class CameraPosition implements Parcelable {
}
/**
+ * Create Builder from an exisiting array of doubles.
+ *
+ * @param values Values containing target, bearing, tilt and zoom
+ */
+ public Builder(double[] values) {
+ super();
+ if (values != null && values.length == 5) {
+ this.target = new LatLng(values[0], values[1]);
+ this.bearing = (float) values[2];
+ this.tilt = (float) values[3];
+ this.zoom = (float) values[4];
+ }
+ }
+
+
+ /**
* Sets the direction that the camera is pointing in, in degrees clockwise from north.
*
* @param bearing Bearing
* @return Builder
*/
- public Builder bearing(float bearing) {
- if(isRadiant){
+ public Builder bearing(double bearing) {
+ if (isRadiant) {
this.bearing = bearing;
- }else{
+ } else {
// converting degrees to radiant
this.bearing = (float) (-bearing * MathConstants.DEG2RAD);
}
@@ -243,10 +259,10 @@ public final class CameraPosition implements Parcelable {
* @return Builder
*/
@FloatRange(from = 0.0, to = 60.0)
- public Builder tilt(float tilt) {
- if(isRadiant){
+ public Builder tilt(double tilt) {
+ if (isRadiant) {
this.tilt = tilt;
- }else {
+ } else {
// converting degrees to radiant
this.tilt = (float) (MathUtils.clamp(tilt, MapboxConstants.MINIMUM_TILT, MapboxConstants.MAXIMUM_TILT) * MathConstants.DEG2RAD);
}
@@ -259,7 +275,7 @@ public final class CameraPosition implements Parcelable {
* @param zoom Zoom value
* @return Builder
*/
- public Builder zoom(float zoom) {
+ public Builder zoom(double zoom) {
this.zoom = zoom;
return this;
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraUpdateFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraUpdateFactory.java
index df156961a0..93d1cd2e66 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraUpdateFactory.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/camera/CameraUpdateFactory.java
@@ -148,12 +148,12 @@ public final class CameraUpdateFactory {
static final class CameraPositionUpdate implements CameraUpdate {
- private final float bearing;
+ private final double bearing;
private final LatLng target;
- private final float tilt;
- private final float zoom;
+ private final double tilt;
+ private final double zoom;
- CameraPositionUpdate(float bearing, LatLng target, float tilt, float zoom) {
+ CameraPositionUpdate(double bearing, LatLng target, double tilt, double zoom) {
this.bearing = bearing;
this.target = target;
this.tilt = tilt;
@@ -164,15 +164,15 @@ public final class CameraUpdateFactory {
return target;
}
- public float getBearing() {
+ public double getBearing() {
return bearing;
}
- public float getTilt() {
+ public double getTilt() {
return tilt;
}
- public float getZoom() {
+ public double getZoom() {
return zoom;
}
@@ -311,7 +311,7 @@ public final class CameraUpdateFactory {
@Type
private final int type;
- private final float zoom;
+ private final double zoom;
private float x;
private float y;
@@ -332,7 +332,7 @@ public final class CameraUpdateFactory {
this.y = y;
}
- public float getZoom() {
+ public double getZoom() {
return zoom;
}
@@ -349,7 +349,7 @@ public final class CameraUpdateFactory {
return y;
}
- public float transformZoom(float currentZoom) {
+ public double transformZoom(double currentZoom) {
switch (getType()) {
case CameraUpdateFactory.ZoomUpdate.ZOOM_IN:
currentZoom++;
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
index cd2d0c68ac..483099a387 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
@@ -1193,32 +1193,18 @@ public class MapView extends FrameLayout {
}
}
- /**
- * Get Bearing in degrees
- *
- * @return Bearing in degrees
- */
+ CameraPosition invalidateCameraPosition() {
+ return new CameraPosition.Builder(mNativeMapView.getCameraValues()).build();
+ }
+
double getBearing() {
return mNativeMapView.getBearing();
}
- /**
- * Set Bearing in degrees
- *
- * @param bearing Bearing in degrees
- */
void setBearing(float bearing) {
mNativeMapView.setBearing(bearing);
}
- /**
- * Sets Bearing in degrees
- * <p/>
- * NOTE: Used by UserLocationView
- *
- * @param bearing Bearing in degrees
- * @param duration Length of time to rotate
- */
void setBearing(float bearing, long duration) {
mNativeMapView.setBearing(bearing, duration);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
index c5050defee..93ef6a8299 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
@@ -323,12 +323,7 @@ public class MapboxMap {
*/
private void invalidateCameraPosition() {
mInvalidCameraPosition = false;
- mCameraPosition = new CameraPosition.Builder(true)
- .bearing((float) mMapView.getBearing())
- .target(mMapView.getLatLng())
- .tilt((float) mMapView.getTilt())
- .zoom((float) mMapView.getZoom())
- .build();
+ mCameraPosition = mMapView.invalidateCameraPosition();
if (mOnCameraChangeListener != null) {
mOnCameraChangeListener.onCameraChange(mCameraPosition);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
index b7f583e943..7948097ec7 100755
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
@@ -487,6 +487,10 @@ final class NativeMapView {
nativeRemoveCustomLayer(mNativeMapViewPtr, id);
}
+ public double[] getCameraValues(){
+ return nativeGetCameraValues(mNativeMapViewPtr);
+ }
+
//
// Callbacks
//
@@ -680,4 +684,6 @@ final class NativeMapView {
private native void nativeAddCustomLayer(long nativeMapViewPtr, CustomLayer customLayer, String before);
private native void nativeRemoveCustomLayer(long nativeMapViewPtr, String id);
+
+ private native double[] nativeGetCameraValues(long mNativeMapViewPtr);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java
index b2364dc042..dcc440dd1c 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/UserLocationView.java
@@ -278,7 +278,7 @@ public final class UserLocationView extends View {
mMarkerScreenPoint.y);
} else if (mMyLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) {
- float bearing;
+ double bearing;
if (mShowDirection) {
bearing = mMyBearingTrackingMode == MyBearingTracking.COMPASS ? mBearingChangeListener.getCompassBearing() : mUserLocation.getBearing();
} else {
@@ -309,10 +309,10 @@ public final class UserLocationView extends View {
// rotate so arrow in points to bearing
if (mShowDirection) {
if (mMyBearingTrackingMode == MyBearingTracking.COMPASS && mMyLocationTrackingMode == MyLocationTracking.TRACKING_NONE) {
- mMarkerScreenMatrix.preRotate(mCompassMarkerDirection + mMapboxMap.getCameraPosition().bearing);
+ mMarkerScreenMatrix.preRotate((float)(mCompassMarkerDirection + mMapboxMap.getCameraPosition().bearing));
} else if (mMyBearingTrackingMode == MyBearingTracking.GPS) {
if (mMyLocationTrackingMode == MyLocationTracking.TRACKING_NONE) {
- mMarkerScreenMatrix.preRotate(mGpsMarkerDirection + mMapboxMap.getCameraPosition().bearing);
+ mMarkerScreenMatrix.preRotate((float)(mGpsMarkerDirection + mMapboxMap.getCameraPosition().bearing));
} else {
mMarkerScreenMatrix.preRotate(mGpsMarkerDirection);
}
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index 07e5d1a66b..0da07d5fce 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -772,6 +772,30 @@ jobject JNICALL nativeGetLatLng(JNIEnv *env, jobject obj, jlong nativeMapViewPtr
return ret;
}
+jdoubleArray JNICALL nativeGetCameraValues(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) {
+ mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetCameraValues");
+ assert(nativeMapViewPtr != 0);
+ NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
+ mbgl::LatLng latLng = nativeMapView->getMap().getLatLng(nativeMapView->getInsets());
+ jdoubleArray output = env->NewDoubleArray(5);
+ jsize start = 0;
+ jsize leng = 5;
+ jdouble buf[5];
+ buf[0] = latLng.latitude;
+ buf[1] = latLng.longitude;
+ buf[2] = nativeMapView->getMap().getBearing();
+ buf[3] = nativeMapView->getMap().getPitch();
+ buf[4] = nativeMapView->getMap().getZoom();
+ env->SetDoubleArrayRegion(output, start, leng, buf);
+
+ if (output == nullptr) {
+ env->ExceptionDescribe();
+ return nullptr;
+ }
+
+ return output;
+}
+
void JNICALL nativeResetPosition(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) {
mbgl::Log::Debug(mbgl::Event::JNI, "nativeResetPosition");
assert(nativeMapViewPtr != 0);
@@ -2830,6 +2854,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
{"nativeGetLatLng", "(J)Lcom/mapbox/mapboxsdk/geometry/LatLng;",
reinterpret_cast<void *>(&nativeGetLatLng)},
{"nativeResetPosition", "(J)V", reinterpret_cast<void *>(&nativeResetPosition)},
+ {"nativeGetCameraValues","(J)[D", reinterpret_cast<void *>(&nativeGetCameraValues)},
{"nativeGetPitch", "(J)D", reinterpret_cast<void *>(&nativeGetPitch)},
{"nativeSetPitch", "(JDJ)V", reinterpret_cast<void *>(&nativeSetPitch)},
{"nativeScaleBy", "(JDDDJ)V", reinterpret_cast<void *>(&nativeScaleBy)},