diff options
author | kevin <kevin.li@mapbox.com> | 2019-06-25 17:20:04 +0800 |
---|---|---|
committer | kevin <kevin.li@mapbox.com> | 2019-06-26 15:16:49 +0800 |
commit | ce08efffc0b89f38b9768eb05c666e192af21793 (patch) | |
tree | 7b1973fcaa1100ccded5c555fa69ea58f067232f | |
parent | 45ec7709f36ab7ffed4260f9b3e2f0b8bab42c93 (diff) | |
download | qtlocation-mapboxgl-ce08efffc0b89f38b9768eb05c666e192af21793.tar.gz |
Add shift in CameraPosition
6 files changed, 242 insertions, 6 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 f44c0f1904..7c297bd0f4 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 @@ -8,6 +8,8 @@ import android.support.annotation.Keep; import android.support.annotation.NonNull; import android.support.annotation.Nullable; + +import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -168,7 +170,7 @@ public final class CameraPosition implements Parcelable { * Builder for composing CameraPosition objects. */ public static final class Builder { - + private boolean needShift = true; private double bearing = -1; @Nullable private LatLng target = null; @@ -221,6 +223,8 @@ public final class CameraPosition implements Parcelable { */ public Builder(@Nullable CameraUpdateFactory.CameraPositionUpdate update) { super(); + // The location in update is shifted before, so no need to shift again. + needShift = false; if (update != null) { bearing = update.getBearing(); target = update.getTarget(); @@ -236,6 +240,8 @@ public final class CameraPosition implements Parcelable { */ public Builder(@Nullable CameraUpdateFactory.ZoomUpdate update) { super(); + // The location in update is shifted before, so no need to shift again. + needShift = false; if (update != null) { this.zoom = update.getZoom(); } @@ -312,6 +318,10 @@ public final class CameraPosition implements Parcelable { * @return CameraPosition */ public CameraPosition build() { + if (needShift && target != null) { + Point point = Point.fromLngLat(target.getLongitude(), target.getLatitude()); + this.target = new LatLng(point.latitude(), point.longitude()); + } return new CameraPosition(target, zoom, tilt, bearing); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java index c48dfc5e0a..6337287770 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinator.java @@ -9,7 +9,6 @@ import android.support.annotation.VisibleForTesting; import android.util.SparseArray; import android.view.animation.LinearInterpolator; -import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.log.Logger; @@ -91,10 +90,7 @@ final class LocationAnimatorCoordinator { targetCameraBearing = checkGpsNorth(isGpsNorth, targetCameraBearing); updateLayerAnimators(previousLayerLatLng, targetLatLng, previousLayerBearing, targetLayerBearing); - - Point p = Point.fromLngLat(targetLatLng.getLongitude(), targetLatLng.getLatitude()); - updateCameraAnimators(previousCameraLatLng, previousCameraBearing, new LatLng(p.latitude(),p.longitude()), - targetCameraBearing); + updateCameraAnimators(previousCameraLatLng, previousCameraBearing, targetLatLng, targetCameraBearing); boolean snap = immediateAnimation(projection, previousCameraLatLng, targetLatLng) || immediateAnimation(projection, previousLayerLatLng, targetLatLng); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index bb2bef35fb..206d036cf5 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -878,6 +878,17 @@ android:value=".activity.FeatureOverviewActivity" /> </activity> <activity + android:name=".activity.location.LocationShiftActivity" + android:description="@string/description_location_shift" + android:label="@string/activity_location_shift"> + <meta-data + android:name="@string/category" + android:value="@string/category_location" /> + <meta-data + android:name="android.support.PARENT_ACTIVITY" + android:value=".activity.FeatureOverviewActivity" /> + </activity> + <activity android:name=".activity.location.ManualLocationUpdatesActivity" android:description="@string/description_location_manual" android:label="@string/activity_location_manual"> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt new file mode 100644 index 0000000000..3aade2c529 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationShiftActivity.kt @@ -0,0 +1,217 @@ +package com.mapbox.mapboxsdk.testapp.activity.location + +import android.annotation.SuppressLint +import android.app.Fragment +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import com.mapbox.android.core.location.LocationEngineCallback +import com.mapbox.android.core.location.LocationEngineResult +import com.mapbox.android.core.permissions.PermissionsListener +import com.mapbox.android.core.permissions.PermissionsManager +import com.mapbox.geojson.Point +import com.mapbox.geojson.shifter.CoordinateShifter +import com.mapbox.geojson.shifter.CoordinateShifterManager +import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions +import com.mapbox.mapboxsdk.location.modes.CameraMode.TRACKING +import com.mapbox.mapboxsdk.maps.MapView +import com.mapbox.mapboxsdk.maps.MapboxMap +import com.mapbox.mapboxsdk.maps.Style +import com.mapbox.mapboxsdk.testapp.R +import kotlinx.android.synthetic.main.activity_location_layer_fragment.* +import java.util.ArrayList + +class LocationShiftActivity : AppCompatActivity() { + private lateinit var permissionsManager: PermissionsManager + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_location_layer_fragment) + + fab.setOnClickListener { + val fragment = fragmentManager.findFragmentByTag(EmptyFragment.TAG) + if (fragment == null) { + fragmentManager + .beginTransaction() + .replace(R.id.container, EmptyFragment.newInstance(), EmptyFragment.TAG) + .addToBackStack("transaction2") + .commit() + } else { + this.onBackPressed() + } + } + CoordinateShifterManager.setCoordinateShifter(coordinateShifter()) + + supportActionBar?.setDisplayHomeAsUpEnabled(true) + + if (PermissionsManager.areLocationPermissionsGranted(this)) { + if (savedInstanceState == null) { + fragmentManager + .beginTransaction() + .replace(R.id.container, LocationFragment.newInstance(), LocationFragment.TAG) + .commit() + } + } else { + permissionsManager = PermissionsManager(object : PermissionsListener { + override fun onExplanationNeeded(permissionsToExplain: MutableList<String>?) { + Toast.makeText(this@LocationShiftActivity, "You need to accept location permissions.", + Toast.LENGTH_SHORT).show() + } + + override fun onPermissionResult(granted: Boolean) { + if (granted) { + if (savedInstanceState == null) { + fragmentManager + .beginTransaction() + .replace(R.id.container, LocationFragment.newInstance(), LocationFragment.TAG) + .commit() + } + } else { + finish() + } + } + }) + permissionsManager.requestLocationPermissions(this) + } + } + + private fun coordinateShifter(): CoordinateShifter { + return object : CoordinateShifter { + override fun shiftLonLat(lon: Double, lat: Double): List<Double> { + return shift(lon, lat) + } + + override fun shiftLonLatAlt(lon: Double, lat: Double, altitude: Double): List<Double> { + val shiftedLongLat = shift(lon, lat) + shiftedLongLat.add(altitude) + return shiftedLongLat + } + + override fun unshiftPoint(shiftedPoint: Point): List<Double> { + val shiftedCoordinates = ArrayList<Double>(2) + shiftedCoordinates.add(shiftedPoint.longitude()) + shiftedCoordinates.add(shiftedPoint.latitude()) + return shiftedCoordinates + } + + override fun unshiftPoint(shiftedCoordinates: List<Double>): List<Double> { + // Left empty on purpose + return shiftedCoordinates + } + + private fun shift(lon: Double, lat: Double): MutableList<Double> { + val shiftedCoordinates = ArrayList<Double>(3) + val shiftedLon = lon + 0.5 + val shiftedLat = lat + 0.5 + shiftedCoordinates.add(shiftedLon) + shiftedCoordinates.add(shiftedLat) + return shiftedCoordinates + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults) + } + + class LocationFragment : Fragment(), LocationEngineCallback<LocationEngineResult> { + companion object { + const val TAG = "LFragment" + fun newInstance(): LocationFragment { + return LocationFragment() + } + } + + private lateinit var mapView: MapView + private lateinit var mapboxMap: MapboxMap + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + mapView = MapView(inflater.context) + return mapView + } + + @SuppressLint("MissingPermission") + override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + mapView.getMapAsync { + mapboxMap = it + mapboxMap.setMinZoomPreference(10.0) + it.setStyle(Style.MAPBOX_STREETS) { style -> + val component = mapboxMap.locationComponent + + component.activateLocationComponent(LocationComponentActivationOptions + .builder(activity, style) + .useDefaultLocationEngine(true) + .build()) + + component.isLocationComponentEnabled = true + component.locationEngine?.getLastLocation(this) + component.cameraMode = TRACKING + } + } + } + + override fun onSuccess(result: LocationEngineResult?) { +// mapboxMap.animateCamera(CameraUpdateFactory.newLatLngZoom(LatLng(result?.lastLocation), 12.0)) + } + + override fun onFailure(exception: Exception) { + //noop + } + + override fun onStart() { + super.onStart() + mapView.onStart() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onStop() { + super.onStop() + mapView.onStop() + } + + override fun onLowMemory() { + super.onLowMemory() + mapView.onLowMemory() + } + + override fun onDestroyView() { + super.onDestroyView() + mapView.onDestroy() + CoordinateShifterManager.setCoordinateShifter(null) + } + } + + class EmptyFragment : Fragment() { + companion object { + const val TAG = "EmptyFragment" + fun newInstance(): EmptyFragment { + return EmptyFragment() + } + } + + override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View { + val textView = TextView(inflater?.context) + textView.text = "This is an empty Fragment" + return textView + } + } +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml index 684220f2c4..24727fd74b 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml @@ -77,6 +77,7 @@ <string name="description_location_map_change">Change map\'s style while location is displayed</string> <string name="description_location_modes">Showcases location render and tracking modes</string> <string name="description_location_fragment">Uses LocationComponent in a Fragment</string> + <string name="description_location_shift">Uses LocationComponent with shift</string> <string name="description_location_manual">Force location updates and don\'t rely on the engine</string> <string name="description_location_activation_builder">Use LocationComponentActivationOptions to set options</string> <string name="description_recyclerview_textureview">Show multiple TextureView MapViews as recyclerView items</string> diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml index 027198c71b..c0efaeab4d 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml @@ -76,6 +76,7 @@ <string name="activity_location_map_change">Simple Location Activity</string> <string name="activity_location_modes">Location Modes Activity</string> <string name="activity_location_fragment">Location Fragment</string> + <string name="activity_location_shift">Location Shift</string> <string name="activity_location_manual">Manual Location updates</string> <string name="activity_location_activation_builder">Build Location Activation</string> <string name="activity_recyclerview_textureview">RecyclerView TextureView</string> |