improve multi touch zoom
git-svn-id: https://osmand.googlecode.com/svn/trunk@334 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
68c5662526
commit
fcfff39bf4
5 changed files with 33 additions and 13 deletions
|
@ -21,6 +21,8 @@ public class ToDoConstants {
|
||||||
// (introduce special settings how often update location to monitoring & audio guidance)
|
// (introduce special settings how often update location to monitoring & audio guidance)
|
||||||
// Improvement : Show stops in the transport route on the map
|
// Improvement : Show stops in the transport route on the map
|
||||||
// Improvement : redesign poi selecting (show on map )
|
// Improvement : redesign poi selecting (show on map )
|
||||||
|
/// Better : improve zooming (better zoom out)
|
||||||
|
// BUG with search area for poi/transport bounds region
|
||||||
// 69. Add phone information to POI
|
// 69. Add phone information to POI
|
||||||
|
|
||||||
// Not clear if it is really needed
|
// Not clear if it is really needed
|
||||||
|
|
|
@ -21,6 +21,7 @@ import com.osmand.LogUtil;
|
||||||
import com.osmand.OsmandSettings;
|
import com.osmand.OsmandSettings;
|
||||||
import com.osmand.R;
|
import com.osmand.R;
|
||||||
import com.osmand.osm.LatLon;
|
import com.osmand.osm.LatLon;
|
||||||
|
import com.osmand.views.OsmandMapTileView;
|
||||||
|
|
||||||
public class NavigatePointActivity extends Activity {
|
public class NavigatePointActivity extends Activity {
|
||||||
Dialog dlg;
|
Dialog dlg;
|
||||||
|
@ -128,7 +129,9 @@ public class NavigatePointActivity extends Activity {
|
||||||
} else {
|
} else {
|
||||||
// in case when it is dialog
|
// in case when it is dialog
|
||||||
if(activity != null) {
|
if(activity != null) {
|
||||||
activity.setMapLocation(lat, lon);
|
OsmandMapTileView v = activity.getMapView();
|
||||||
|
activity.getMapView().getAnimatedDraggingThread().startMoving(v.getLatitude(), v.getLongitude(),
|
||||||
|
lat, lon, v.getZoom(), v.getZoom(), v.getSourceTileSize(), v.getRotate(), true);
|
||||||
} else {
|
} else {
|
||||||
OsmandSettings.setMapLocationToShow(this, lat, lon, MessageFormat.format(getString(R.string.search_history_navigate_to), lat, lon));
|
OsmandSettings.setMapLocationToShow(this, lat, lon, MessageFormat.format(getString(R.string.search_history_navigate_to), lat, lon));
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,14 +213,15 @@ public class AnimateDraggingMapThread implements Runnable {
|
||||||
|
|
||||||
endZ = endZoom;
|
endZ = endZoom;
|
||||||
|
|
||||||
timeZInt = Math.abs(curZoom - intZ) * 300;
|
// timeZInt = Math.abs(curZoom - intZ) * 300;
|
||||||
if (timeZInt > 1200) {
|
// if (timeZInt > 900) {
|
||||||
timeZInt = 1200;
|
//
|
||||||
}
|
// }
|
||||||
|
timeZInt = 600;
|
||||||
timeZEnd = 500;
|
timeZEnd = 500;
|
||||||
timeMove = (int) (Math.abs(moveX) + Math.abs(moveY) * 4);
|
timeMove = (int) (Math.abs(moveX) + Math.abs(moveY) * 4);
|
||||||
if(timeMove > 2000){
|
if(timeMove > 2200){
|
||||||
timeMove = 2000;
|
timeMove = 2200;
|
||||||
}
|
}
|
||||||
animateDrag = false;
|
animateDrag = false;
|
||||||
phaseOfMoving = (byte) (intZ == curZoom ? 1 : 0);
|
phaseOfMoving = (byte) (intZ == curZoom ? 1 : 0);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.lang.reflect.Method;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.util.FloatMath;
|
import android.util.FloatMath;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
|
|
||||||
|
@ -21,7 +22,7 @@ public class MultiTouchSupport {
|
||||||
|
|
||||||
public interface MultiTouchZoomListener {
|
public interface MultiTouchZoomListener {
|
||||||
|
|
||||||
public void onZoomStarted(float distance);
|
public void onZoomStarted(float distance, PointF centerPoint);
|
||||||
|
|
||||||
public void onZooming(float distance, float relativeToStart);
|
public void onZooming(float distance, float relativeToStart);
|
||||||
|
|
||||||
|
@ -70,6 +71,7 @@ public class MultiTouchSupport {
|
||||||
private boolean inZoomMode = false;
|
private boolean inZoomMode = false;
|
||||||
private float zoomStartedDistance = 100;
|
private float zoomStartedDistance = 100;
|
||||||
private float previousZoom = 1;
|
private float previousZoom = 1;
|
||||||
|
private PointF centerPoint = new PointF();
|
||||||
|
|
||||||
public boolean onTouchEvent(MotionEvent event){
|
public boolean onTouchEvent(MotionEvent event){
|
||||||
if(!isMultiTouchSupported()){
|
if(!isMultiTouchSupported()){
|
||||||
|
@ -91,7 +93,8 @@ public class MultiTouchSupport {
|
||||||
float distance = FloatMath.sqrt((x2 - x1)*(x2 -x1) + (y2-y1)*(y2-y1));
|
float distance = FloatMath.sqrt((x2 - x1)*(x2 -x1) + (y2-y1)*(y2-y1));
|
||||||
previousZoom = distance / zoomStartedDistance;
|
previousZoom = distance / zoomStartedDistance;
|
||||||
if (actionCode == ACTION_POINTER_DOWN) {
|
if (actionCode == ACTION_POINTER_DOWN) {
|
||||||
listener.onZoomStarted(distance);
|
centerPoint = new PointF((x1 + x2) / 2, (y1 + y2) / 2);
|
||||||
|
listener.onZoomStarted(distance, centerPoint);
|
||||||
zoomStartedDistance = distance;
|
zoomStartedDistance = distance;
|
||||||
inZoomMode = true;
|
inZoomMode = true;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -97,6 +97,8 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
||||||
private AnimateDraggingMapThread animatedDraggingThread;
|
private AnimateDraggingMapThread animatedDraggingThread;
|
||||||
|
|
||||||
private float initialMultiTouchZoom;
|
private float initialMultiTouchZoom;
|
||||||
|
private PointF initialMultiTouchCenterPoint;
|
||||||
|
private LatLon initialMultiTouchLocation;
|
||||||
|
|
||||||
private GestureDetector gestureDetector;
|
private GestureDetector gestureDetector;
|
||||||
|
|
||||||
|
@ -701,22 +703,31 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onZoomEnded(float distance, float relativeToStart) {
|
public void onZoomEnded(float distance, float relativeToStart) {
|
||||||
float dz = (float) (Math.log(relativeToStart) / Math.log(2) * 1.5);
|
onZooming(distance, relativeToStart);
|
||||||
initialMultiTouchZoom = (float) Math.round(initialMultiTouchZoom + dz);
|
|
||||||
setZoom(initialMultiTouchZoom);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onZoomStarted(float distance) {
|
public void onZoomStarted(float distance, PointF centerPoint) {
|
||||||
|
initialMultiTouchCenterPoint = centerPoint;
|
||||||
|
initialMultiTouchLocation = getLatLonFromScreenPoint(centerPoint.x, centerPoint.y);
|
||||||
initialMultiTouchZoom = zoom;
|
initialMultiTouchZoom = zoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onZooming(float distance, float relativeToStart) {
|
public void onZooming(float distance, float relativeToStart) {
|
||||||
float dz = (float) (Math.log(relativeToStart) / Math.log(2) * 1.5);
|
float dz = (float) (Math.log(relativeToStart) / Math.log(2) * 1.5);
|
||||||
|
float dtx = calcDiffTileX(getCenterPointX() - initialMultiTouchCenterPoint.x, getCenterPointY() - initialMultiTouchCenterPoint.y);
|
||||||
|
float dty = calcDiffTileY(getCenterPointX() - initialMultiTouchCenterPoint.x, getCenterPointY() - initialMultiTouchCenterPoint.y);
|
||||||
|
double tx = MapUtils.getTileNumberX(getFloatZoom(), initialMultiTouchLocation.getLongitude());
|
||||||
|
double ty = MapUtils.getTileNumberY(getFloatZoom(), initialMultiTouchLocation.getLatitude());
|
||||||
|
double lat = MapUtils.getLatitudeFromTile(getFloatZoom(), ty + dty);
|
||||||
|
double lon = MapUtils.getLongitudeFromTile(getFloatZoom(), tx + dtx);
|
||||||
|
|
||||||
|
|
||||||
if(Math.abs(initialMultiTouchZoom + dz - zoom) > 0.05){
|
if(Math.abs(initialMultiTouchZoom + dz - zoom) > 0.05){
|
||||||
setZoom(initialMultiTouchZoom + dz);
|
setZoom(initialMultiTouchZoom + dz);
|
||||||
|
setLatLon(lat, lon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue