Add a measurement of the distance between the fingers
This commit is contained in:
parent
a23c6f78de
commit
2785a7a089
4 changed files with 108 additions and 27 deletions
|
@ -33,6 +33,9 @@ public class MultiTouchSupport {
|
|||
|
||||
public void onGestureInit(float x1, float y1, float x2, float y2);
|
||||
|
||||
public void onActionPointerDownOrMove(PointF first, PointF second);
|
||||
|
||||
public void onActionPointerUp();
|
||||
}
|
||||
|
||||
private boolean multiTouchAPISupported = false;
|
||||
|
@ -103,6 +106,11 @@ public class MultiTouchSupport {
|
|||
angleDefined = true;
|
||||
angle = (float) (Math.atan2(y2 - y1, x2 -x1) * 180 / Math.PI);
|
||||
}
|
||||
if (actionCode == MotionEvent.ACTION_DOWN || actionCode == MotionEvent.ACTION_MOVE) {
|
||||
listener.onActionPointerDownOrMove(new PointF(x1, y1), new PointF(x2, y2));
|
||||
} else if (actionCode == MotionEvent.ACTION_UP || actionCode == MotionEvent.ACTION_POINTER_UP) {
|
||||
listener.onActionPointerUp();
|
||||
}
|
||||
if (actionCode == ACTION_POINTER_DOWN) {
|
||||
centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2);
|
||||
listener.onGestureInit(x1, y1, x2, y2);
|
||||
|
|
|
@ -161,6 +161,11 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
|||
private boolean afterDoubleTap = false;
|
||||
private boolean wasMapLinkedBeforeGesture = false;
|
||||
|
||||
private PointF firstPointer;
|
||||
private PointF secondPointer;
|
||||
private LatLon firstPointerLatLon;
|
||||
private LatLon secondPointerLatLon;
|
||||
|
||||
public OsmandMapTileView(MapActivity activity, int w, int h) {
|
||||
this.activity = activity;
|
||||
init(activity, w, h);
|
||||
|
@ -171,6 +176,11 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
|||
application = (OsmandApplication) ctx.getApplicationContext();
|
||||
settings = application.getSettings();
|
||||
|
||||
firstPointer = new PointF(-1, -1);
|
||||
secondPointer = new PointF(-1, -1);
|
||||
firstPointerLatLon = new LatLon(-1, -1);
|
||||
secondPointerLatLon = new LatLon(-1, -1);
|
||||
|
||||
paintGrayFill = new Paint();
|
||||
paintGrayFill.setColor(Color.GRAY);
|
||||
paintGrayFill.setStyle(Style.FILL);
|
||||
|
@ -305,6 +315,22 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
|||
}
|
||||
|
||||
// ///////////////////////// NON UI PART (could be extracted in common) /////////////////////////////
|
||||
public PointF getFirstPointer() {
|
||||
return firstPointer;
|
||||
}
|
||||
|
||||
public PointF getSecondPointer() {
|
||||
return secondPointer;
|
||||
}
|
||||
|
||||
public LatLon getFirstPointerLatLon() {
|
||||
return firstPointerLatLon;
|
||||
}
|
||||
|
||||
public LatLon getSecondPointerLatLon() {
|
||||
return secondPointerLatLon;
|
||||
}
|
||||
|
||||
public void setIntZoom(int zoom) {
|
||||
zoom = zoom > getMaxZoom() ? getMaxZoom() : zoom;
|
||||
zoom = zoom < getMinZoom() ? getMinZoom() : zoom;
|
||||
|
@ -1007,6 +1033,22 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
|
|||
this.y1 = y1;
|
||||
this.x2 = x2;
|
||||
this.y2 = y2;
|
||||
firstPointerLatLon = currentViewport.getLatLonFromPixel(x1, y1);
|
||||
secondPointerLatLon = currentViewport.getLatLonFromPixel(x2, y2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActionPointerDownOrMove(PointF first, PointF second) {
|
||||
firstPointer.set(first);
|
||||
secondPointer.set(second);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActionPointerUp() {
|
||||
firstPointer.set(-1, -1);
|
||||
secondPointer.set(-1, -1);
|
||||
firstPointerLatLon = new LatLon(-1, -1);
|
||||
secondPointerLatLon = new LatLon(-1, -1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -7,6 +7,7 @@ import android.graphics.Color;
|
|||
import android.graphics.DashPathEffect;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Paint.Style;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
|
||||
import net.osmand.Location;
|
||||
|
@ -86,10 +87,16 @@ public class RulerControlLayer extends OsmandMapLayer {
|
|||
final RulerMode mode = app.getSettings().RULER_MODE.get();
|
||||
|
||||
if (mode == RulerMode.FIRST) {
|
||||
drawCenterIcon(canvas, tb, center);
|
||||
Location currentLoc = app.getLocationProvider().getLastKnownLocation();
|
||||
if (currentLoc != null) {
|
||||
drawDistance(canvas, tb, center, currentLoc);
|
||||
PointF firstFinger = view.getFirstPointer();
|
||||
PointF secondFinger = view.getSecondPointer();
|
||||
if (firstFinger.x != -1 && firstFinger.y != -1 && secondFinger.x != -1 && secondFinger.y != -1) {
|
||||
drawFingerDistance(canvas, tb, center, firstFinger, secondFinger);
|
||||
} else {
|
||||
drawCenterIcon(canvas, tb, center);
|
||||
Location currentLoc = app.getLocationProvider().getLastKnownLocation();
|
||||
if (currentLoc != null) {
|
||||
drawDistance(canvas, tb, center, currentLoc);
|
||||
}
|
||||
}
|
||||
} else if (mode == RulerMode.SECOND) {
|
||||
drawCenterIcon(canvas, tb, center);
|
||||
|
@ -101,6 +108,12 @@ public class RulerControlLayer extends OsmandMapLayer {
|
|||
}
|
||||
}
|
||||
|
||||
private void drawFingerDistance(Canvas canvas, RotatedTileBox tb, QuadPoint center, PointF first, PointF second) {
|
||||
canvas.rotate(-tb.getRotate(), center.x, center.y);
|
||||
canvas.drawLine(first.x, first.y, second.x, second.y, distancePaint);
|
||||
canvas.rotate(tb.getRotate(), center.x, center.y);
|
||||
}
|
||||
|
||||
private void drawCenterIcon(Canvas canvas, RotatedTileBox tb, QuadPoint center) {
|
||||
canvas.rotate(-tb.getRotate(), center.x, center.y);
|
||||
canvas.drawBitmap(centerIcon, center.x - centerIcon.getWidth() / 2,
|
||||
|
|
|
@ -112,25 +112,43 @@ public class MapInfoWidgetsFactory {
|
|||
|
||||
public TextInfoWidget createRulerControl(final MapActivity map) {
|
||||
final String title = map.getResources().getString(R.string.map_widget_show_ruler);
|
||||
final TextInfoWidget rulerControl = new TextInfoWidget(map) {
|
||||
@Override
|
||||
public boolean updateInfo(DrawSettings drawSettings) {
|
||||
if (map.getMyApplication().getSettings().RULER_MODE.get() == RulerMode.FIRST) {
|
||||
Location currentLoc = map.getMyApplication().getLocationProvider().getLastKnownLocation();
|
||||
LatLon centerLoc = map.getMapLocation();
|
||||
if (currentLoc != null && centerLoc != null) {
|
||||
float dist = (float) MapUtils.getDistance(currentLoc.getLatitude(), currentLoc.getLongitude(),
|
||||
centerLoc.getLatitude(), centerLoc.getLongitude());
|
||||
String distance = OsmAndFormatter.getFormattedDistance(dist, map.getMyApplication());
|
||||
int ls = distance.lastIndexOf(' ');
|
||||
setText(distance.substring(0, ls), distance.substring(ls + 1));
|
||||
} else {
|
||||
setText(title, null);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
final TextInfoWidget rulerControl = new TextInfoWidget(map) {
|
||||
LatLon cacheFirstFinger;
|
||||
LatLon cacheSecondFinger;
|
||||
|
||||
@Override
|
||||
public boolean updateInfo(DrawSettings drawSettings) {
|
||||
if (map.getMyApplication().getSettings().RULER_MODE.get() == RulerMode.FIRST) {
|
||||
Location currentLoc = map.getMyApplication().getLocationProvider().getLastKnownLocation();
|
||||
LatLon centerLoc = map.getMapLocation();
|
||||
LatLon firstFinger = map.getMapView().getFirstPointerLatLon();
|
||||
LatLon secondFinger = map.getMapView().getSecondPointerLatLon();
|
||||
|
||||
if (firstFinger.getLatitude() != -1 && firstFinger.getLongitude() != -1 &&
|
||||
secondFinger.getLatitude() != -1 && secondFinger.getLongitude() != -1) {
|
||||
if (cacheFirstFinger != firstFinger || cacheSecondFinger != secondFinger) {
|
||||
cacheFirstFinger = firstFinger;
|
||||
cacheSecondFinger = secondFinger;
|
||||
setDistanceText(firstFinger.getLatitude(), firstFinger.getLongitude(),
|
||||
secondFinger.getLatitude(), secondFinger.getLongitude());
|
||||
}
|
||||
} else if (currentLoc != null && centerLoc != null) {
|
||||
setDistanceText(currentLoc.getLatitude(), currentLoc.getLongitude(),
|
||||
centerLoc.getLatitude(), centerLoc.getLongitude());
|
||||
} else {
|
||||
setText(title, null);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void setDistanceText(double firstLat, double firstLon, double secondLat, double secondLon) {
|
||||
float dist = (float) MapUtils.getDistance(firstLat, firstLon, secondLat, secondLon);
|
||||
String distance = OsmAndFormatter.getFormattedDistance(dist, map.getMyApplication());
|
||||
int ls = distance.lastIndexOf(' ');
|
||||
setText(distance.substring(0, ls), distance.substring(ls + 1));
|
||||
}
|
||||
};
|
||||
|
||||
rulerControl.setText(title, null);
|
||||
rulerControl.setIcons(R.drawable.widget_distance_day, R.drawable.widget_distance_night);
|
||||
|
@ -663,16 +681,16 @@ public class MapInfoWidgetsFactory {
|
|||
RouteDataObject rt = locationProvider.getLastKnownRouteSegment();
|
||||
if (rt != null) {
|
||||
text = RoutingHelper.formatStreetName(
|
||||
rt.getName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get()),
|
||||
rt.getName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get()),
|
||||
rt.getRef(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(locationProvider.getLastKnownLocation())),
|
||||
rt.getDestinationName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(locationProvider.getLastKnownLocation())),
|
||||
rt.getDestinationName(settings.MAP_PREFERRED_LOCALE.get(), settings.MAP_TRANSLITERATE_NAMES.get(), rt.bearingVsRouteDirection(locationProvider.getLastKnownLocation())),
|
||||
"»");
|
||||
}
|
||||
}
|
||||
if (text == null) {
|
||||
text = "";
|
||||
} else {
|
||||
if(!Algorithms.isEmpty(text) && locationProvider.getLastKnownLocation() != null) {
|
||||
double dist =
|
||||
double dist =
|
||||
CurrentPositionHelper.getOrthogonalDistance(rt, locationProvider.getLastKnownLocation());
|
||||
if(dist < 50) {
|
||||
showMarker = true;
|
||||
|
|
Loading…
Reference in a new issue