tilt gesture in openGL initial commit

This commit is contained in:
veliymolfar 2020-01-13 14:58:03 +02:00
parent 9908398378
commit ed85c92047
3 changed files with 86 additions and 14 deletions

View file

@ -489,6 +489,12 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
} }
} }
public void setMapElevation(float angle) {
if (settings.USE_OPENGL_RENDER.get() && NativeCoreContext.isInit()) {
atlasMapRendererView.setElevationAngle(angle);
}
}
private void createProgressBarForRouting() { private void createProgressBarForRouting() {
final ProgressBar pb = (ProgressBar) findViewById(R.id.map_horizontal_progress); final ProgressBar pb = (ProgressBar) findViewById(R.id.map_horizontal_progress);

View file

@ -36,6 +36,8 @@ public class MultiTouchSupport {
public void onActionPointerUp(); public void onActionPointerUp();
public void onActionCancel(); public void onActionCancel();
public void onChangingViewAngle(float angle);
} }
private boolean multiTouchAPISupported = false; private boolean multiTouchAPISupported = false;
@ -62,6 +64,10 @@ public class MultiTouchSupport {
return inZoomMode; return inZoomMode;
} }
public boolean isInTiltMode() {
return inTiltMode;
}
private void initMethods(){ private void initMethods(){
try { try {
getPointerCount = MotionEvent.class.getMethod("getPointerCount"); //$NON-NLS-1$ getPointerCount = MotionEvent.class.getMethod("getPointerCount"); //$NON-NLS-1$
@ -76,9 +82,17 @@ public class MultiTouchSupport {
} }
private boolean inZoomMode = false; private boolean inZoomMode = false;
private boolean inTiltMode = false;
private double zoomStartedDistance = 100; private double zoomStartedDistance = 100;
private double zoomRelative = 1; private double zoomRelative = 1;
private PointF centerPoint = new PointF(); private PointF centerPoint = new PointF();
private PointF firstFingerStart = new PointF();
private PointF secondFingerStart = new PointF();
private static final int TILT_X_THRESHOLD_PX = 40;
private static final int TILT_Y_THRESHOLD_PX = 40;
private static final int TILT_DY_THRESHOLD_PX = 40;
private static final float ROTATION_THRESHOLD_DEG = 15.0f;
private boolean isRotating;
public boolean onTouchEvent(MotionEvent event){ public boolean onTouchEvent(MotionEvent event){
if(!isMultiTouchSupported()){ if(!isMultiTouchSupported()){
@ -91,9 +105,10 @@ public class MultiTouchSupport {
} }
Integer pointCount = (Integer) getPointerCount.invoke(event); Integer pointCount = (Integer) getPointerCount.invoke(event);
if(pointCount < 2){ if(pointCount < 2){
if(inZoomMode){ if (inZoomMode || inTiltMode) {
listener.onZoomOrRotationEnded(zoomRelative, angleRelative); listener.onZoomOrRotationEnded(zoomRelative, angleRelative);
inZoomMode = false; inZoomMode = false;
inTiltMode = false;
return true; return true;
} }
return false; return false;
@ -114,28 +129,63 @@ public class MultiTouchSupport {
} }
if (actionCode == ACTION_POINTER_DOWN) { if (actionCode == ACTION_POINTER_DOWN) {
centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2); centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2);
firstFingerStart = new PointF(x1, y1);
secondFingerStart = new PointF(x2, y2);
listener.onGestureInit(x1, y1, x2, y2); listener.onGestureInit(x1, y1, x2, y2);
listener.onZoomStarted(centerPoint); listener.onZoomStarted(centerPoint);
zoomStartedDistance = distance;
angleStarted = angle;
inZoomMode = true;
return true; return true;
} else if(actionCode == ACTION_POINTER_UP){ } else if(actionCode == ACTION_POINTER_UP){
if(inZoomMode){ if (inZoomMode || inTiltMode) {
listener.onZoomOrRotationEnded(zoomRelative, angleRelative); listener.onZoomOrRotationEnded(zoomRelative, angleRelative);
inZoomMode = false; inZoomMode = false;
inTiltMode = false;
} }
return true; return true;
} else if(inZoomMode && actionCode == MotionEvent.ACTION_MOVE){ } else if (actionCode == MotionEvent.ACTION_MOVE) {
// Keep zoom center fixed or flexible if (inZoomMode) {
centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2);
if(angleDefined) { // Keep zoom center fixed or flexible
angleRelative = MapUtils.unifyRotationTo360(angle - angleStarted); centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2);
if (angleDefined) {
float a = MapUtils.unifyRotationTo360(angle - angleStarted);
if (!isRotating && Math.abs(a) > ROTATION_THRESHOLD_DEG) {
isRotating = true;
angleStarted = angle;
} else if (isRotating) {
angleRelative = a;
}
}
zoomRelative = distance / zoomStartedDistance;
listener.onZoomingOrRotating(zoomRelative, angleRelative);
return true;
} else if (inTiltMode) {
float dy2 = secondFingerStart.y - y2;
float viewAngle = dy2 / 8f;
listener.onChangingViewAngle(viewAngle);
} else {
float dx1 = Math.abs(firstFingerStart.x - x1);
float dx2 = Math.abs(secondFingerStart.x - x2);
float dy1 = Math.abs(firstFingerStart.y - y1);
float dy2 = Math.abs(secondFingerStart.y - y2);
float startDy = Math.abs(secondFingerStart.y - firstFingerStart.y);
if (dx1 < TILT_X_THRESHOLD_PX && dx2 < TILT_X_THRESHOLD_PX
&& dy1 > TILT_Y_THRESHOLD_PX && dy2 > TILT_Y_THRESHOLD_PX
&& startDy < TILT_Y_THRESHOLD_PX * 6
&& Math.abs(dy2 - dy1) < TILT_DY_THRESHOLD_PX) {
inTiltMode = true;
} else if (dx1 > TILT_X_THRESHOLD_PX || dx2 > TILT_X_THRESHOLD_PX
|| Math.abs(dy2 - dy1) > TILT_DY_THRESHOLD_PX
|| Math.abs(dy1 - dy2) > TILT_DY_THRESHOLD_PX) {
listener.onZoomStarted(centerPoint);
zoomStartedDistance = distance;
angleStarted = angle;
angleRelative = 0;
zoomRelative = 0;
isRotating = false;
inZoomMode = true;
}
} }
zoomRelative = distance / zoomStartedDistance;
listener.onZoomingOrRotating(zoomRelative, angleRelative);
return true;
} }
} catch (Exception e) { } catch (Exception e) {
log.debug("Multi touch exception" , e); //$NON-NLS-1$ log.debug("Multi touch exception" , e); //$NON-NLS-1$

View file

@ -1199,6 +1199,11 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
multiTouch = false; multiTouch = false;
} }
@Override
public void onChangingViewAngle(float angle) {
setElevationAngle(angle);
}
@Override @Override
public void onZoomStarted(PointF centerPoint) { public void onZoomStarted(PointF centerPoint) {
initialMultiTouchCenterPoint = centerPoint; initialMultiTouchCenterPoint = centerPoint;
@ -1287,6 +1292,15 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
} }
private void setElevationAngle(float angle) {
if (angle < 35f) {
angle = 35f;
} else if (angle > 90f) {
angle = 90f;
}
((MapActivity) activity).setMapElevation(angle);
}
private boolean isZoomingAllowed(int baseZoom, float dz) { private boolean isZoomingAllowed(int baseZoom, float dz) {
if (baseZoom > getMaxZoom()) { if (baseZoom > getMaxZoom()) {
return false; return false;
@ -1346,7 +1360,9 @@ public class OsmandMapTileView implements IMapDownloaderCallback {
@Override @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
dragToAnimate(e2.getX() + distanceX, e2.getY() + distanceY, e2.getX(), e2.getY(), true); if (!multiTouchSupport.isInTiltMode()) {
dragToAnimate(e2.getX() + distanceX, e2.getY() + distanceY, e2.getX(), e2.getY(), true);
}
return true; return true;
} }