commit
17a8a0718b
4 changed files with 120 additions and 70 deletions
|
@ -186,6 +186,8 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
||||||
private boolean mIsDestroyed = false;
|
private boolean mIsDestroyed = false;
|
||||||
private InAppHelper inAppHelper;
|
private InAppHelper inAppHelper;
|
||||||
|
|
||||||
|
private DrawerLayout.DrawerListener drawerListener;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
long tm = System.currentTimeMillis();
|
long tm = System.currentTimeMillis();
|
||||||
|
@ -287,6 +289,28 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
||||||
|
|
||||||
mapActions.updateDrawerMenu();
|
mapActions.updateDrawerMenu();
|
||||||
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
|
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);
|
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
|
||||||
screenOffReceiver = new ScreenOffReceiver();
|
screenOffReceiver = new ScreenOffReceiver();
|
||||||
|
@ -978,6 +1002,9 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
|
||||||
if (inAppHelper != null) {
|
if (inAppHelper != null) {
|
||||||
inAppHelper.stop();
|
inAppHelper.stop();
|
||||||
}
|
}
|
||||||
|
if (drawerLayout != null) {
|
||||||
|
drawerLayout.removeDrawerListener(drawerListener);
|
||||||
|
}
|
||||||
mIsDestroyed = true;
|
mIsDestroyed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -331,6 +331,10 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
return multiTouch;
|
return multiTouch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMultiTouch(boolean multiTouch) {
|
||||||
|
this.multiTouch = multiTouch;
|
||||||
|
}
|
||||||
|
|
||||||
public void setIntZoom(int zoom) {
|
public void setIntZoom(int zoom) {
|
||||||
zoom = zoom > getMaxZoom() ? getMaxZoom() : zoom;
|
zoom = zoom > getMaxZoom() ? getMaxZoom() : zoom;
|
||||||
zoom = zoom < getMinZoom() ? getMinZoom() : zoom;
|
zoom = zoom < getMinZoom() ? getMinZoom() : zoom;
|
||||||
|
@ -1033,6 +1037,13 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
||||||
this.y1 = y1;
|
this.y1 = y1;
|
||||||
this.x2 = x2;
|
this.x2 = x2;
|
||||||
this.y2 = y2;
|
this.y2 = y2;
|
||||||
|
if (x1 != x2 || y1 != y2) {
|
||||||
|
firstTouchPointX = x1;
|
||||||
|
firstTouchPointY = y1;
|
||||||
|
secondTouchPointX = x2;
|
||||||
|
secondTouchPointY = y2;
|
||||||
|
multiTouch = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
import net.osmand.Location;
|
import net.osmand.Location;
|
||||||
import net.osmand.data.QuadPoint;
|
import net.osmand.data.QuadPoint;
|
||||||
|
@ -25,6 +26,7 @@ public class RulerControlLayer extends OsmandMapLayer {
|
||||||
private final MapActivity mapActivity;
|
private final MapActivity mapActivity;
|
||||||
private OsmandApplication app;
|
private OsmandApplication app;
|
||||||
private OsmandMapTileView view;
|
private OsmandMapTileView view;
|
||||||
|
private View rightWidgetsPanel;
|
||||||
|
|
||||||
private TextSide textSide;
|
private TextSide textSide;
|
||||||
private int maxRadiusInDp;
|
private int maxRadiusInDp;
|
||||||
|
@ -55,6 +57,7 @@ public class RulerControlLayer extends OsmandMapLayer {
|
||||||
cacheDistances = new ArrayList<>();
|
cacheDistances = new ArrayList<>();
|
||||||
cacheCenter = new QuadPoint();
|
cacheCenter = new QuadPoint();
|
||||||
maxRadiusInDp = mapActivity.getResources().getDimensionPixelSize(R.dimen.map_ruler_radius);
|
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);
|
centerIconDay = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_ruler_center_day);
|
||||||
centerIconNight = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_ruler_center_night);
|
centerIconNight = BitmapFactory.decodeResource(view.getResources(), R.drawable.map_ruler_center_night);
|
||||||
|
@ -78,28 +81,28 @@ public class RulerControlLayer extends OsmandMapLayer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDraw(Canvas canvas, RotatedTileBox tb, DrawSettings settings) {
|
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);
|
lineAttrs.updatePaints(view, settings, tb);
|
||||||
circleAttrs.updatePaints(view, settings, tb);
|
circleAttrs.updatePaints(view, settings, tb);
|
||||||
circleAttrs.paint2.setStyle(Style.FILL);
|
circleAttrs.paint2.setStyle(Style.FILL);
|
||||||
final QuadPoint center = tb.getCenterPixelPoint();
|
final QuadPoint center = tb.getCenterPixelPoint();
|
||||||
final RulerMode mode = app.getSettings().RULER_MODE.get();
|
final RulerMode mode = app.getSettings().RULER_MODE.get();
|
||||||
|
|
||||||
if (mode == RulerMode.FIRST) {
|
if (view.isMultiTouch()) {
|
||||||
if (view.isMultiTouch()) {
|
float x1 = view.getFirstTouchPointX();
|
||||||
float x1 = view.getFirstTouchPointX();
|
float y1 = view.getFirstTouchPointY();
|
||||||
float y1 = view.getFirstTouchPointY();
|
float x2 = view.getSecondTouchPointX();
|
||||||
float x2 = view.getSecondTouchPointX();
|
float y2 = view.getSecondTouchPointY();
|
||||||
float y2 = view.getSecondTouchPointY();
|
drawFingerDistance(canvas, tb, center, x1, y1, x2, y2);
|
||||||
drawFingerDistance(canvas, tb, center, x1, y1, x2, y2);
|
} else if (mode == RulerMode.FIRST) {
|
||||||
} else {
|
drawCenterIcon(canvas, tb, center, settings.isNightMode());
|
||||||
drawCenterIcon(canvas, tb, center, settings.isNightMode());
|
Location currentLoc = app.getLocationProvider().getLastKnownLocation();
|
||||||
Location currentLoc = app.getLocationProvider().getLastKnownLocation();
|
if (currentLoc != null) {
|
||||||
if (currentLoc != null) {
|
drawDistance(canvas, tb, center, currentLoc);
|
||||||
drawDistance(canvas, tb, center, currentLoc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (mode == RulerMode.SECOND) {
|
}
|
||||||
|
if (mode == RulerMode.SECOND) {
|
||||||
drawCenterIcon(canvas, tb, center, settings.isNightMode());
|
drawCenterIcon(canvas, tb, center, settings.isNightMode());
|
||||||
updateData(tb, center);
|
updateData(tb, center);
|
||||||
for (int i = 1; i <= cacheDistances.size(); i++) {
|
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) {
|
private void drawDistance(Canvas canvas, RotatedTileBox tb, QuadPoint center, Location currentLoc) {
|
||||||
int currentLocX = tb.getPixXFromLonNoRot(currentLoc.getLongitude());
|
int currX = tb.getPixXFromLonNoRot(currentLoc.getLongitude());
|
||||||
int currentLocY = tb.getPixYFromLatNoRot(currentLoc.getLatitude());
|
int currY = tb.getPixYFromLatNoRot(currentLoc.getLatitude());
|
||||||
canvas.drawLine(currentLocX, currentLocY, center.x, center.y, lineAttrs.paint);
|
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) {
|
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) {
|
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()) {
|
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.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.shadowPaint);
|
||||||
canvas.drawCircle(center.x, center.y, radius * circleNumber, circleAttrs.paint);
|
canvas.drawCircle(center.x, center.y, radius * circleNumber, circleAttrs.paint);
|
||||||
|
|
|
@ -185,44 +185,36 @@ public class MapInfoWidgetsFactory {
|
||||||
final String title = map.getResources().getString(R.string.map_widget_show_ruler);
|
final String title = map.getResources().getString(R.string.map_widget_show_ruler);
|
||||||
final TextInfoWidget rulerControl = new TextInfoWidget(map) {
|
final TextInfoWidget rulerControl = new TextInfoWidget(map) {
|
||||||
boolean needNewLatLon;
|
boolean needNewLatLon;
|
||||||
RulerMode cacheMode = map.getMyApplication().getSettings().RULER_MODE.get();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean updateInfo(DrawSettings drawSettings) {
|
public boolean updateInfo(DrawSettings drawSettings) {
|
||||||
RulerMode mode = map.getMyApplication().getSettings().RULER_MODE.get();
|
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();
|
Location currentLoc = map.getMyApplication().getLocationProvider().getLastKnownLocation();
|
||||||
LatLon centerLoc = map.getMapLocation();
|
LatLon centerLoc = map.getMapLocation();
|
||||||
OsmandMapTileView view = map.getMapView();
|
|
||||||
|
|
||||||
|
if (currentLoc != null && centerLoc != null) {
|
||||||
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) {
|
|
||||||
setDistanceText(currentLoc.getLatitude(), currentLoc.getLongitude(),
|
setDistanceText(currentLoc.getLatitude(), currentLoc.getLongitude(),
|
||||||
centerLoc.getLatitude(), centerLoc.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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -240,7 +232,6 @@ public class MapInfoWidgetsFactory {
|
||||||
rulerControl.setOnClickListener(new OnClickListener() {
|
rulerControl.setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
rulerControl.setText(title, null);
|
|
||||||
final RulerMode mode = map.getMyApplication().getSettings().RULER_MODE.get();
|
final RulerMode mode = map.getMyApplication().getSettings().RULER_MODE.get();
|
||||||
RulerMode newMode = RulerMode.FIRST;
|
RulerMode newMode = RulerMode.FIRST;
|
||||||
if (mode == RulerMode.FIRST) {
|
if (mode == RulerMode.FIRST) {
|
||||||
|
|
Loading…
Reference in a new issue