Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[android] - expose moveBy, replace CameraUpdateFactory hook to moveBy…
Browse files Browse the repository at this point in the history
… for scrolling api
  • Loading branch information
tobrun committed Nov 5, 2018
1 parent 68fd3a2 commit 1c73356
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ public interface CameraUpdate {
CameraPosition getCameraPosition(@NonNull MapboxMap mapboxMap);

}

Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,9 @@ public static CameraUpdate newLatLngZoom(@NonNull LatLng latLng, double zoom) {
* @param xPixel Amount of pixels to scroll to in x direction
* @param yPixel Amount of pixels to scroll to in y direction
* @return CameraUpdate Final Camera Position
* @deprecated use {@link MapboxMap#scrollBy(float, float)} for more precise displacements when using a padded map.
*/
@Deprecated
public static CameraUpdate scrollBy(float xPixel, float yPixel) {
return new CameraMoveUpdate(xPixel, yPixel);
}
Expand Down Expand Up @@ -336,22 +338,27 @@ static final class CameraMoveUpdate implements CameraUpdate {
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();
PointF targetPoint = new PointF(viewPortWidth / 2 + x, viewPortHeight / 2 + y);
int[] padding = mapboxMap.getPadding();

// Convert point to LatLng
LatLng latLng = projection.fromScreenLocation(targetPoint);
// 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();
return new CameraPosition.Builder()
.target(latLng != null ? latLng : previousPosition.target)
.zoom(previousPosition.zoom)
.tilt(previousPosition.tilt)
.bearing(previousPosition.bearing)
.build();
CameraPosition position =
new CameraPosition.Builder()
.target(latLng)
.zoom(previousPosition.zoom)
.tilt(previousPosition.tilt)
.bearing(previousPosition.bearing)
.build();
return position;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -866,6 +866,29 @@ private void invalidateCameraPosition() {
}
}

/**
* Scrolls the camera over the map, shifting the center of view by the specified number of pixels in the x and y
* directions.
*
* @param x Amount of pixels to scroll to in x direction
* @param y Amount of pixels to scroll to in y direction
*/
public void scrollBy(float x, float y) {
nativeMapView.moveBy(x, y);
}

/**
* Scrolls the camera over the map, shifting the center of view by the specified number of pixels in the x and y
* directions.
*
* @param x Amount of pixels to scroll to in x direction
* @param y Amount of pixels to scroll to in y direction
* @param duration Amount of time the scrolling should take
*/
public void scrollBy(float x, float y, long duration) {
nativeMapView.moveBy(x, y, duration);
}

//
// Reset North
//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.mapbox.mapboxsdk.maps

import android.support.test.espresso.UiController
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
import com.mapbox.mapboxsdk.testapp.activity.BaseActivityTest
import com.mapbox.mapboxsdk.testapp.activity.maplayout.SimpleMapActivity
import com.mapbox.mapboxsdk.testapp.utils.TestConstants
import org.junit.Assert.assertEquals
import org.junit.Test


class TransformTest: BaseActivityTest() {

override fun getActivityClass(): Class<*> = SimpleMapActivity::class.java

companion object {
val initialCameraUpdate = CameraUpdateFactory.newLatLngZoom(LatLng(12.0,12.0), 12.0)!!
val scrollByCameraUpdate = CameraUpdateFactory.scrollBy(400.0f,0.0f)!!
}

@Test
fun cameraUpdateScrollByWithPadding() {
validateTestSetup()
invoke(mapboxMap) { uiController: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.moveCamera(scrollByCameraUpdate)
val expectedCameraPosition = mapboxMap.cameraPosition

mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.setPadding(250,250,0,0)
mapboxMap.moveCamera(scrollByCameraUpdate)
val actualCameraPosition = mapboxMap.cameraPosition

assertEquals("Camera position latitude should match",
expectedCameraPosition.target.latitude,
actualCameraPosition.target.longitude,
TestConstants.LAT_LNG_DELTA
)

assertEquals("Camera position longitude should match",
expectedCameraPosition.target.longitude,
actualCameraPosition.target.longitude,
TestConstants.LAT_LNG_DELTA
)
}
}

@Test
fun mapboxMapScrollByWithPadding() {
validateTestSetup()
invoke(mapboxMap) { uiController: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.scrollBy(400.0f, 0.0f)
val expectedCameraPosition = mapboxMap.cameraPosition

mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.setPadding(250,250,0,0)
mapboxMap.scrollBy(400.0f, 0.0f)
val actualCameraPosition = mapboxMap.cameraPosition

assertEquals("Camera position should match", expectedCameraPosition, actualCameraPosition)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import android.view.MenuItem;
import android.widget.SeekBar;
import android.widget.TextView;

import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
Expand All @@ -36,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll_by);

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

ActionBar actionBar = getSupportActionBar();
Expand All @@ -45,15 +44,15 @@ protected void onCreate(Bundle savedInstanceState) {
actionBar.setDisplayShowHomeEnabled(true);
}

seekBarX = (SeekBar) findViewById(R.id.seekbar_move_x);
TextView textViewX = (TextView) findViewById(R.id.textview_x);
seekBarX = findViewById(R.id.seekbar_move_x);
TextView textViewX = findViewById(R.id.textview_x);
seekBarX.setOnSeekBarChangeListener(new PixelBarChangeListener(textViewX, R.string.scrollby_x_value));

seekBarY = (SeekBar) findViewById(R.id.seekbar_move_y);
TextView textViewY = (TextView) findViewById(R.id.textview_y);
seekBarY = findViewById(R.id.seekbar_move_y);
TextView textViewY = findViewById(R.id.textview_y);
seekBarY.setOnSeekBarChangeListener(new PixelBarChangeListener(textViewY, R.string.scrollby_y_value));

mapView = (MapView) findViewById(R.id.mapView);
mapView = findViewById(R.id.mapView);
mapView.setTag(true);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(this);
Expand All @@ -65,11 +64,10 @@ public void onMapReady(MapboxMap map) {
UiSettings uiSettings = mapboxMap.getUiSettings();
uiSettings.setLogoEnabled(false);
uiSettings.setAttributionEnabled(false);

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setColorFilter(ContextCompat.getColor(ScrollByActivity.this, R.color.primary));
fab.setOnClickListener(view -> mapboxMap.easeCamera(CameraUpdateFactory.scrollBy(
seekBarX.getProgress() * MULTIPLIER_PER_PIXEL,
fab.setOnClickListener(view -> mapboxMap.easeCamera(
CameraUpdateFactory.scrollBy(seekBarX.getProgress() * MULTIPLIER_PER_PIXEL,
seekBarY.getProgress() * MULTIPLIER_PER_PIXEL)
));
}
Expand Down Expand Up @@ -133,7 +131,7 @@ private static class PixelBarChangeListener implements SeekBar.OnSeekBarChangeLi
private int prefixTextResource;
private TextView valueView;

public PixelBarChangeListener(@NonNull TextView textView, @StringRes int textRes) {
PixelBarChangeListener(@NonNull TextView textView, @StringRes int textRes) {
valueView = textView;
prefixTextResource = textRes;
}
Expand Down

0 comments on commit 1c73356

Please sign in to comment.