From 1798b5fd5d0eb89f195dca3e20ec0a74f410cabc Mon Sep 17 00:00:00 2001 From: kevin Date: Wed, 4 Sep 2019 14:37:07 +0800 Subject: [PATCH 1/3] Add option to config max width of scalebar. --- .../plugins/scalebar/ScaleBarTest.java | 24 ++++++++++++ .../activity/scalebar/ScalebarActivity.kt | 1 + .../pluginscalebar/ScaleBarOptions.java | 22 +++++++++++ .../mapbox/pluginscalebar/ScaleBarWidget.java | 37 +++++++++++++++++-- 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 299594c2d..237937ac0 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -20,6 +20,9 @@ import timber.log.Timber; import static com.mapbox.mapboxsdk.plugins.annotation.MapboxMapAction.invoke; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.HALF; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.QUARTER; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.THIRD; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; @@ -247,4 +250,25 @@ public void testMetrics() { assertFalse(scaleBarWidget.isMetricUnit()); }); } + + @Test + public void testRatio() { + validateTestSetup(); + setupScaleBar(); + assertEquals(HALF,scaleBarWidget.getRatio()); + invoke(mapboxMap, (uiController, mapboxMap) -> { + ScaleBarOptions option = new ScaleBarOptions(activity); + option.setRatio(THIRD); + scaleBarWidget = scaleBarPlugin.create(option); + assertNotNull(scaleBarWidget); + assertEquals(THIRD, scaleBarWidget.getRatio()); + }); + invoke(mapboxMap, (uiController, mapboxMap) -> { + ScaleBarOptions option = new ScaleBarOptions(activity); + option.setRatio(QUARTER); + scaleBarWidget = scaleBarPlugin.create(option); + assertNotNull(scaleBarWidget); + assertEquals(QUARTER, scaleBarWidget.getRatio()); + }); + } } diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index ba52e0cab..2a6d832b7 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -46,6 +46,7 @@ class ScalebarActivity : AppCompatActivity() { .setMarginTop(15f) .setMarginLeft(16f) .setTextBarMargin(15f) + .setRatio(ScaleBarOptions.ScaleBarRatio.QUARTER) scaleBarPlugin.create(scaleBarOptions) fabScaleWidget.setOnClickListener { diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java index 20bfab614..38b0dfaa7 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java @@ -16,6 +16,15 @@ public class ScaleBarOptions { public static final int REFRESH_INTERVAL_DEFAULT = 15; + /** + * Enum for scale bar max width ratio compared with MapView width. + */ + public enum ScaleBarRatio { + HALF, + THIRD, + QUARTER + } + private final Context context; private int refreshInterval; private int textColor; @@ -28,6 +37,7 @@ public class ScaleBarOptions { private float borderWidth; private float textSize; private boolean isMetricUnit; + private ScaleBarRatio ratio; public ScaleBarOptions(@NonNull Context context) { this.context = context; @@ -42,6 +52,7 @@ public ScaleBarOptions(@NonNull Context context) { setTextColor(android.R.color.black); setPrimaryColor(android.R.color.black); setSecondaryColor(android.R.color.white); + setRatio(ScaleBarRatio.HALF); } /** @@ -62,6 +73,7 @@ ScaleBarWidget build() { scaleBarWidget.setSecondaryColor(secondaryColor); scaleBarWidget.setTextColor(textColor); scaleBarWidget.setTextSize(textSize); + scaleBarWidget.setRatio(ratio); return scaleBarWidget; } @@ -256,6 +268,16 @@ public ScaleBarOptions setTextBarMargin(@DimenRes int textBarMargin) { return this; } + /** + * Set the ratio of scale bar max width compared with MapView width. + * + * @param ratio the ratio scale bar will use. + */ + public ScaleBarOptions setRatio(ScaleBarRatio ratio) { + this.ratio = ratio; + return this; + } + /** * Helper class to determine the user measuring system. *

diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index c63d616fb..6a803c186 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -19,6 +19,9 @@ import static com.mapbox.pluginscalebar.ScaleBarConstants.KILOMETER; import static com.mapbox.pluginscalebar.ScaleBarConstants.KILOMETER_UNIT; import static com.mapbox.pluginscalebar.ScaleBarConstants.MILE_UNIT; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.HALF; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.QUARTER; +import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.THIRD; /** * The scale widget is a visual representation of the scale bar plugin. @@ -41,6 +44,7 @@ public class ScaleBarWidget extends View { private float textSize; private double distancePerPixel; private boolean isMetricUnit; + private float ratio; private ArrayList> scaleTable; private String unit; private final RefreshHandler refreshHandler; @@ -59,7 +63,7 @@ protected void onDraw(Canvas canvas) { if (distancePerPixel <= 0) { return; } - double maxDistance = mapViewWidth * distancePerPixel / 2; + double maxDistance = mapViewWidth * distancePerPixel * ratio; Pair pair = scaleTable.get(0); for (int i = 1; i < scaleTable.size(); i++) { pair = scaleTable.get(i); @@ -71,7 +75,7 @@ protected void onDraw(Canvas canvas) { } int unitDistance = pair.first / pair.second; - float unitBarWidth = maxBarWidth / 2f; + float unitBarWidth = maxBarWidth / pair.second; if (unitDistance == 0) { unitDistance = 1; } else { @@ -179,7 +183,7 @@ public float getMarginLeft() { */ public void setMarginLeft(float marginLeft) { this.marginLeft = marginLeft; - maxBarWidth = mapViewWidth / 2f - marginLeft; + maxBarWidth = mapViewWidth * ratio - marginLeft; } /** @@ -346,7 +350,7 @@ public int getMapViewWidth() { */ void setMapViewWidth(int mapViewWidth) { this.mapViewWidth = mapViewWidth; - maxBarWidth = mapViewWidth / 2f - marginLeft; + maxBarWidth = mapViewWidth * ratio - marginLeft; } /** @@ -364,6 +368,31 @@ private String getDistanceText(int distance) { } } + /** + * Set the ratio of scale bar max width compared with MapView width. + * @param ratio the ratio scale bar will use. + */ + public void setRatio(ScaleBarOptions.ScaleBarRatio ratio) { + switch (ratio) { + case HALF: + this.ratio = 0.5f; + break; + case THIRD: + this.ratio = 0.33f; + break; + default: + this.ratio = 0.25f; + } + } + + /** + * Get the current ratio of scale bar. + * @return current ratio. + */ + public ScaleBarOptions.ScaleBarRatio getRatio() { + return this.ratio == 0.5f ? HALF : this.ratio == 0.33f ? THIRD : QUARTER; + } + /** * Handler class to limit the refresh frequent. */ From a9bff1ee6cf74ece9e0b3904cbe570430efc069b Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 8 Oct 2019 14:34:52 +0800 Subject: [PATCH 2/3] Using ratio to config max width of scalebar. --- .../plugins/scalebar/ScaleBarTest.java | 13 +++++------- .../activity/scalebar/ScalebarActivity.kt | 2 +- .../pluginscalebar/ScaleBarOptions.java | 17 ++++------------ .../mapbox/pluginscalebar/ScaleBarWidget.java | 20 ++++--------------- 4 files changed, 14 insertions(+), 38 deletions(-) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 237937ac0..4829631e2 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -20,9 +20,6 @@ import timber.log.Timber; import static com.mapbox.mapboxsdk.plugins.annotation.MapboxMapAction.invoke; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.HALF; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.QUARTER; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.THIRD; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; @@ -255,20 +252,20 @@ public void testMetrics() { public void testRatio() { validateTestSetup(); setupScaleBar(); - assertEquals(HALF,scaleBarWidget.getRatio()); + assertEquals(0.5f,scaleBarWidget.getRatio(), 0f); invoke(mapboxMap, (uiController, mapboxMap) -> { ScaleBarOptions option = new ScaleBarOptions(activity); - option.setRatio(THIRD); + option.setRatio(0.1f); scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); - assertEquals(THIRD, scaleBarWidget.getRatio()); + assertEquals(0.1f, scaleBarWidget.getRatio(), 0f); }); invoke(mapboxMap, (uiController, mapboxMap) -> { ScaleBarOptions option = new ScaleBarOptions(activity); - option.setRatio(QUARTER); + option.setRatio(1.0f); scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); - assertEquals(QUARTER, scaleBarWidget.getRatio()); + assertEquals(1.0f, scaleBarWidget.getRatio(), 0f); }); } } diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index 2a6d832b7..e8ad5683d 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -46,7 +46,7 @@ class ScalebarActivity : AppCompatActivity() { .setMarginTop(15f) .setMarginLeft(16f) .setTextBarMargin(15f) - .setRatio(ScaleBarOptions.ScaleBarRatio.QUARTER) + .setRatio(0.5f) scaleBarPlugin.create(scaleBarOptions) fabScaleWidget.setOnClickListener { diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java index 38b0dfaa7..1fab8a447 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java @@ -16,15 +16,6 @@ public class ScaleBarOptions { public static final int REFRESH_INTERVAL_DEFAULT = 15; - /** - * Enum for scale bar max width ratio compared with MapView width. - */ - public enum ScaleBarRatio { - HALF, - THIRD, - QUARTER - } - private final Context context; private int refreshInterval; private int textColor; @@ -37,7 +28,7 @@ public enum ScaleBarRatio { private float borderWidth; private float textSize; private boolean isMetricUnit; - private ScaleBarRatio ratio; + private float ratio; public ScaleBarOptions(@NonNull Context context) { this.context = context; @@ -52,7 +43,7 @@ public ScaleBarOptions(@NonNull Context context) { setTextColor(android.R.color.black); setPrimaryColor(android.R.color.black); setSecondaryColor(android.R.color.white); - setRatio(ScaleBarRatio.HALF); + setRatio(0.5f); } /** @@ -271,9 +262,9 @@ public ScaleBarOptions setTextBarMargin(@DimenRes int textBarMargin) { /** * Set the ratio of scale bar max width compared with MapView width. * - * @param ratio the ratio scale bar will use. + * @param ratio the ratio scale bar will use, must be in the range from 0.1f to 1.0f. */ - public ScaleBarOptions setRatio(ScaleBarRatio ratio) { + public ScaleBarOptions setRatio(@FloatRange(from = 0.1f, to = 1.0f) float ratio) { this.ratio = ratio; return this; } diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java index 6a803c186..f7fdeb3d6 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarWidget.java @@ -19,9 +19,6 @@ import static com.mapbox.pluginscalebar.ScaleBarConstants.KILOMETER; import static com.mapbox.pluginscalebar.ScaleBarConstants.KILOMETER_UNIT; import static com.mapbox.pluginscalebar.ScaleBarConstants.MILE_UNIT; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.HALF; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.QUARTER; -import static com.mapbox.pluginscalebar.ScaleBarOptions.ScaleBarRatio.THIRD; /** * The scale widget is a visual representation of the scale bar plugin. @@ -372,25 +369,16 @@ private String getDistanceText(int distance) { * Set the ratio of scale bar max width compared with MapView width. * @param ratio the ratio scale bar will use. */ - public void setRatio(ScaleBarOptions.ScaleBarRatio ratio) { - switch (ratio) { - case HALF: - this.ratio = 0.5f; - break; - case THIRD: - this.ratio = 0.33f; - break; - default: - this.ratio = 0.25f; - } + public void setRatio(float ratio) { + this.ratio = ratio; } /** * Get the current ratio of scale bar. * @return current ratio. */ - public ScaleBarOptions.ScaleBarRatio getRatio() { - return this.ratio == 0.5f ? HALF : this.ratio == 0.33f ? THIRD : QUARTER; + public float getRatio() { + return this.ratio; } /** From fbbbb63cd1ee30b764677ad1b1852c8aeb122e90 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 10 Mar 2020 16:55:01 +0800 Subject: [PATCH 3/3] Fix review comment --- .../com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java | 4 ++-- .../plugins/testapp/activity/scalebar/ScalebarActivity.kt | 2 +- .../main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java index 4829631e2..3f61a94f9 100644 --- a/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java +++ b/app/src/androidTest/java/com/mapbox/mapboxsdk/plugins/scalebar/ScaleBarTest.java @@ -255,14 +255,14 @@ public void testRatio() { assertEquals(0.5f,scaleBarWidget.getRatio(), 0f); invoke(mapboxMap, (uiController, mapboxMap) -> { ScaleBarOptions option = new ScaleBarOptions(activity); - option.setRatio(0.1f); + option.setMaxWidthRatio(0.1f); scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(0.1f, scaleBarWidget.getRatio(), 0f); }); invoke(mapboxMap, (uiController, mapboxMap) -> { ScaleBarOptions option = new ScaleBarOptions(activity); - option.setRatio(1.0f); + option.setMaxWidthRatio(1.0f); scaleBarWidget = scaleBarPlugin.create(option); assertNotNull(scaleBarWidget); assertEquals(1.0f, scaleBarWidget.getRatio(), 0f); diff --git a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt index e8ad5683d..d2b66dc4f 100644 --- a/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt +++ b/app/src/main/java/com/mapbox/mapboxsdk/plugins/testapp/activity/scalebar/ScalebarActivity.kt @@ -46,7 +46,7 @@ class ScalebarActivity : AppCompatActivity() { .setMarginTop(15f) .setMarginLeft(16f) .setTextBarMargin(15f) - .setRatio(0.5f) + .setMaxWidthRatio(0.5f) scaleBarPlugin.create(scaleBarOptions) fabScaleWidget.setOnClickListener { diff --git a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java index 1fab8a447..6ac8e373c 100644 --- a/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java +++ b/plugin-scalebar/src/main/java/com/mapbox/pluginscalebar/ScaleBarOptions.java @@ -4,6 +4,7 @@ import androidx.annotation.ColorRes; import androidx.annotation.DimenRes; +import androidx.annotation.FloatRange; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.core.content.ContextCompat; @@ -43,7 +44,7 @@ public ScaleBarOptions(@NonNull Context context) { setTextColor(android.R.color.black); setPrimaryColor(android.R.color.black); setSecondaryColor(android.R.color.white); - setRatio(0.5f); + setMaxWidthRatio(0.5f); } /** @@ -264,7 +265,7 @@ public ScaleBarOptions setTextBarMargin(@DimenRes int textBarMargin) { * * @param ratio the ratio scale bar will use, must be in the range from 0.1f to 1.0f. */ - public ScaleBarOptions setRatio(@FloatRange(from = 0.1f, to = 1.0f) float ratio) { + public ScaleBarOptions setMaxWidthRatio(@FloatRange(from = 0.1f, to = 1.0f) float ratio) { this.ratio = ratio; return this; }