diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 689bfa3640..ad848835d1 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -186,6 +186,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven private boolean mIsDestroyed = false; private InAppHelper inAppHelper; + private DrawerLayout.DrawerListener drawerListener; + @Override public void onCreate(Bundle savedInstanceState) { long tm = System.currentTimeMillis(); @@ -287,6 +289,28 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven mapActions.updateDrawerMenu(); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + drawerListener = new DrawerLayout.DrawerListener() { + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + mapView.setMultiTouch(false); + } + + @Override + public void onDrawerOpened(View drawerView) { + + } + + @Override + public void onDrawerClosed(View drawerView) { + + } + + @Override + public void onDrawerStateChanged(int newState) { + + } + }; + drawerLayout.addDrawerListener(drawerListener); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); screenOffReceiver = new ScreenOffReceiver(); @@ -978,6 +1002,9 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven if (inAppHelper != null) { inAppHelper.stop(); } + if (drawerLayout != null) { + drawerLayout.removeDrawerListener(drawerListener); + } mIsDestroyed = true; } diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 80c0b84067..6e7e8efeb1 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -331,6 +331,10 @@ public class OsmandMapTileView implements IMapDownloaderCallback { return multiTouch; } + public void setMultiTouch(boolean multiTouch) { + this.multiTouch = multiTouch; + } + public void setIntZoom(int zoom) { zoom = zoom > getMaxZoom() ? getMaxZoom() : zoom; zoom = zoom < getMinZoom() ? getMinZoom() : zoom; @@ -1033,6 +1037,13 @@ public class OsmandMapTileView implements IMapDownloaderCallback { this.y1 = y1; this.x2 = x2; this.y2 = y2; + if (x1 != x2 || y1 != y2) { + firstTouchPointX = x1; + firstTouchPointY = y1; + secondTouchPointX = x2; + secondTouchPointY = y2; + multiTouch = true; + } } @Override diff --git a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java index 7e92c2da14..ba23596476 100644 --- a/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/RulerControlLayer.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Rect; +import android.view.View; import net.osmand.Location; import net.osmand.data.QuadPoint; @@ -25,6 +26,7 @@ public class RulerControlLayer extends OsmandMapLayer { private final MapActivity mapActivity; private OsmandApplication app; private OsmandMapTileView view; + private View rightWidgetsPanel; private TextSide textSide; private int maxRadiusInDp; @@ -55,6 +57,7 @@ public class RulerControlLayer extends OsmandMapLayer { cacheDistances = new ArrayList<>(); cacheCenter = new QuadPoint(); maxRadiusInDp = mapActivity.getResources().getDimensionPixelSize(R.dimen.map_ruler_radius); + rightWidgetsPanel = mapActivity.findViewById(R.id.map_right_widgets_panel); centerIconDay = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_ruler_center_day); centerIconNight = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_ruler_center_night); @@ -78,28 +81,28 @@ public class RulerControlLayer extends OsmandMapLayer { @Override public void onDraw(Canvas canvas, RotatedTileBox tb, DrawSettings settings) { - if (mapActivity.getMapLayers().getMapWidgetRegistry().isVisible("ruler")) { + if (mapActivity.getMapLayers().getMapWidgetRegistry().isVisible("ruler") && + rightWidgetsPanel.getVisibility() == View.VISIBLE) { lineAttrs.updatePaints(view, settings, tb); circleAttrs.updatePaints(view, settings, tb); circleAttrs.paint2.setStyle(Style.FILL); final QuadPoint center = tb.getCenterPixelPoint(); final RulerMode mode = app.getSettings().RULER_MODE.get(); - if (mode == RulerMode.FIRST) { - if (view.isMultiTouch()) { - float x1 = view.getFirstTouchPointX(); - float y1 = view.getFirstTouchPointY(); - float x2 = view.getSecondTouchPointX(); - float y2 = view.getSecondTouchPointY(); - drawFingerDistance(canvas, tb, center, x1, y1, x2, y2); - } else { - drawCenterIcon(canvas, tb, center, settings.isNightMode()); - Location currentLoc = app.getLocationProvider().getLastKnownLocation(); - if (currentLoc != null) { - drawDistance(canvas, tb, center, currentLoc); - } + if (view.isMultiTouch()) { + float x1 = view.getFirstTouchPointX(); + float y1 = view.getFirstTouchPointY(); + float x2 = view.getSecondTouchPointX(); + float y2 = view.getSecondTouchPointY(); + drawFingerDistance(canvas, tb, center, x1, y1, x2, y2); + } else if (mode == RulerMode.FIRST) { + drawCenterIcon(canvas, tb, center, settings.isNightMode()); + Location currentLoc = app.getLocationProvider().getLastKnownLocation(); + if (currentLoc != null) { + drawDistance(canvas, tb, center, currentLoc); } - } else if (mode == RulerMode.SECOND) { + } + if (mode == RulerMode.SECOND) { drawCenterIcon(canvas, tb, center, settings.isNightMode()); updateData(tb, center); for (int i = 1; i <= cacheDistances.size(); i++) { @@ -128,9 +131,27 @@ public class RulerControlLayer extends OsmandMapLayer { } private void drawDistance(Canvas canvas, RotatedTileBox tb, QuadPoint center, Location currentLoc) { - int currentLocX = tb.getPixXFromLonNoRot(currentLoc.getLongitude()); - int currentLocY = tb.getPixYFromLatNoRot(currentLoc.getLatitude()); - canvas.drawLine(currentLocX, currentLocY, center.x, center.y, lineAttrs.paint); + int currX = tb.getPixXFromLonNoRot(currentLoc.getLongitude()); + int currY = tb.getPixYFromLatNoRot(currentLoc.getLatitude()); + int width = tb.getPixWidth(); + int height = tb.getPixHeight(); + + if (currX < 0 || currY < 0 || currX > width || currY > height) { + float x = (currX + center.x) / 2; + float y = (currY + center.y) / 2; + + while (true) { + if (x < 0 || y < 0 || x > width || y > height) { + currX = (int) x; + currY = (int) y; + } else { + break; + } + x = (x + center.x) / 2; + y = (y + center.y) / 2; + } + } + canvas.drawLine(currX, currY, center.x, center.y, lineAttrs.paint); } private void updateData(RotatedTileBox tb, QuadPoint center) { @@ -191,30 +212,30 @@ public class RulerControlLayer extends OsmandMapLayer { } private void drawCircle(Canvas canvas, RotatedTileBox tb, int circleNumber, QuadPoint center) { - Rect bounds = new Rect(); - String text = cacheDistances.get(circleNumber - 1); - circleAttrs.paint2.getTextBounds(text, 0, text.length(), bounds); - - // coords of left or top text - float x1 = 0; - float y1 = 0; - // coords of right or bottom text - float x2 = 0; - float y2 = 0; - - if (textSide == TextSide.VERTICAL) { - x1 = center.x - bounds.width() / 2; - y1 = center.y - radius * circleNumber + bounds.height() / 2; - x2 = center.x - bounds.width() / 2; - y2 = center.y + radius * circleNumber + bounds.height() / 2; - } else if (textSide == TextSide.HORIZONTAL) { - x1 = center.x - radius * circleNumber - bounds.width() / 2; - y1 = center.y + bounds.height() / 2; - x2 = center.x + radius * circleNumber - bounds.width() / 2; - y2 = center.y + bounds.height() / 2; - } - if (!mapActivity.getMapView().isZooming()) { + Rect bounds = new Rect(); + String text = cacheDistances.get(circleNumber - 1); + circleAttrs.paint2.getTextBounds(text, 0, text.length(), bounds); + + // coords of left or top text + float x1 = 0; + float y1 = 0; + // coords of right or bottom text + float x2 = 0; + float y2 = 0; + + if (textSide == TextSide.VERTICAL) { + x1 = center.x - bounds.width() / 2; + y1 = center.y - radius * circleNumber + bounds.height() / 2; + x2 = center.x - bounds.width() / 2; + y2 = center.y + radius * circleNumber + bounds.height() / 2; + } else if (textSide == TextSide.HORIZONTAL) { + x1 = center.x - radius * circleNumber - bounds.width() / 2; + y1 = center.y + bounds.height() / 2; + x2 = center.x + radius * circleNumber - bounds.width() / 2; + y2 = center.y + bounds.height() / 2; + } + canvas.rotate(-tb.getRotate(), center.x, center.y); canvas.drawCircle(center.x, center.y, radius * circleNumber, circleAttrs.shadowPaint); canvas.drawCircle(center.x, center.y, radius * circleNumber, circleAttrs.paint); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java index 86d6ca014b..39db38f904 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapInfoWidgetsFactory.java @@ -185,44 +185,36 @@ public class MapInfoWidgetsFactory { final String title = map.getResources().getString(R.string.map_widget_show_ruler); final TextInfoWidget rulerControl = new TextInfoWidget(map) { boolean needNewLatLon; - RulerMode cacheMode = map.getMyApplication().getSettings().RULER_MODE.get(); @Override public boolean updateInfo(DrawSettings drawSettings) { RulerMode mode = map.getMyApplication().getSettings().RULER_MODE.get(); - if (mode == RulerMode.FIRST) { + OsmandMapTileView view = map.getMapView(); + + if (view.isMultiTouch()) { + if (needNewLatLon) { + float x1 = view.getFirstTouchPointX(); + float y1 = view.getFirstTouchPointY(); + float x2 = view.getSecondTouchPointX(); + float y2 = view.getSecondTouchPointY(); + LatLon firstFinger = view.getCurrentRotatedTileBox().getLatLonFromPixel(x1, y1); + LatLon secondFinger = view.getCurrentRotatedTileBox().getLatLonFromPixel(x2, y2); + setDistanceText(firstFinger.getLatitude(), firstFinger.getLongitude(), + secondFinger.getLatitude(), secondFinger.getLongitude()); + needNewLatLon = false; + } + } else if (mode == RulerMode.FIRST || mode == RulerMode.SECOND) { Location currentLoc = map.getMyApplication().getLocationProvider().getLastKnownLocation(); LatLon centerLoc = map.getMapLocation(); - OsmandMapTileView view = map.getMapView(); - - if (view.isMultiTouch()) { - if (needNewLatLon) { - float x1 = view.getFirstTouchPointX(); - float y1 = view.getFirstTouchPointY(); - float x2 = view.getSecondTouchPointX(); - float y2 = view.getSecondTouchPointY(); - LatLon firstFinger = view.getCurrentRotatedTileBox().getLatLonFromPixel(x1, y1); - LatLon secondFinger = view.getCurrentRotatedTileBox().getLatLonFromPixel(x2, y2); - setDistanceText(firstFinger.getLatitude(), firstFinger.getLongitude(), - secondFinger.getLatitude(), secondFinger.getLongitude()); - needNewLatLon = false; - } - } else if (currentLoc != null && centerLoc != null) { + if (currentLoc != null && centerLoc != null) { setDistanceText(currentLoc.getLatitude(), currentLoc.getLongitude(), centerLoc.getLatitude(), centerLoc.getLongitude()); - needNewLatLon = true; - } else { - setText(title, null); - needNewLatLon = true; - } - } - if (mode != cacheMode) { - cacheMode = mode; - setRulerControlIcon(this, mode); - if (mode != RulerMode.FIRST) { - setText(title, null); } + needNewLatLon = true; + } else { + setText(title, null); + needNewLatLon = true; } return true; } @@ -240,7 +232,6 @@ public class MapInfoWidgetsFactory { rulerControl.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - rulerControl.setText(title, null); final RulerMode mode = map.getMyApplication().getSettings().RULER_MODE.get(); RulerMode newMode = RulerMode.FIRST; if (mode == RulerMode.FIRST) {