From 17ae9fe0985acdbca6748a850596be1d90f39517 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sat, 8 Sep 2012 14:31:14 +0200 Subject: [PATCH] merge ScaleListener into TouchHandler --- src/org/mapsforge/android/MapView.java | 3 +- .../android/{input => }/TouchHandler.java | 128 +++++++++++++-- .../android/input/ScaleListener.java | 146 ------------------ 3 files changed, 119 insertions(+), 158 deletions(-) rename src/org/mapsforge/android/{input => }/TouchHandler.java (77%) delete mode 100644 src/org/mapsforge/android/input/ScaleListener.java diff --git a/src/org/mapsforge/android/MapView.java b/src/org/mapsforge/android/MapView.java index 03148c51..45881795 100644 --- a/src/org/mapsforge/android/MapView.java +++ b/src/org/mapsforge/android/MapView.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException; -import org.mapsforge.android.input.TouchHandler; import org.mapsforge.android.mapgenerator.IMapGenerator; import org.mapsforge.android.mapgenerator.JobQueue; import org.mapsforge.android.mapgenerator.MapDatabaseFactory; @@ -75,7 +74,7 @@ public class MapView extends GLSurfaceView { */ public static final InternalRenderTheme DEFAULT_RENDER_THEME = InternalRenderTheme.OSMARENDER; - private static final float DEFAULT_TEXT_SCALE = 1; + // private static final float DEFAULT_TEXT_SCALE = 1; private static final Byte DEFAULT_START_ZOOM_LEVEL = Byte.valueOf((byte) 16); public final static boolean debugFrameTime = false; diff --git a/src/org/mapsforge/android/input/TouchHandler.java b/src/org/mapsforge/android/TouchHandler.java similarity index 77% rename from src/org/mapsforge/android/input/TouchHandler.java rename to src/org/mapsforge/android/TouchHandler.java index bf1bc5c8..ce40e210 100644 --- a/src/org/mapsforge/android/input/TouchHandler.java +++ b/src/org/mapsforge/android/TouchHandler.java @@ -12,14 +12,13 @@ * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see . */ -package org.mapsforge.android.input; +package org.mapsforge.android; -import org.mapsforge.android.MapView; -import org.mapsforge.android.MapViewPosition; import org.mapsforge.core.Tile; import android.content.Context; import android.os.CountDownTimer; +import android.os.SystemClock; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; @@ -34,8 +33,8 @@ import android.widget.Scroller; public class TouchHandler { private static final int INVALID_POINTER_ID = -1; - protected final MapView mMapView; - protected final MapViewPosition mMapPosition; + /* package */final MapView mMapView; + /* package */final MapViewPosition mMapPosition; private final float mMapMoveDelta; private boolean mMoveThresholdReached; @@ -60,9 +59,8 @@ public class TouchHandler { mMapPosition = mapView.getMapPosition(); mMapMoveDelta = viewConfiguration.getScaledTouchSlop(); mActivePointerId = INVALID_POINTER_ID; - mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleListener( - mMapView)); - mGestureDetector = new GestureDetector(context, new MapGestureDetector(mMapView)); + mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleListener()); + mGestureDetector = new GestureDetector(context, new MapGestureDetector()); } @@ -230,8 +228,8 @@ public class TouchHandler { private CountDownTimer mTimer = null; private boolean fling = false; - public MapGestureDetector(MapView mapView) { - mScroller = new Scroller(mapView.getContext(), + public MapGestureDetector() { + mScroller = new Scroller(mMapView.getContext(), new android.view.animation.LinearInterpolator()); } @@ -355,4 +353,114 @@ public class TouchHandler { return true; } } + + class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener { + private float mCenterX; + private float mCenterY; + private float mFocusX; + private float mFocusY; + private float mScale; + private boolean mBeginScale; + + @Override + public boolean onScale(ScaleGestureDetector gd) { + + mScale = gd.getScaleFactor(); + mFocusX = gd.getFocusX() - mCenterX; + mFocusY = gd.getFocusY() - mCenterY; + + mSumScale *= mScale; + + mTimeEnd = SystemClock.elapsedRealtime(); + + if (!mBeginScale) { + if (mTimeEnd - mTimeStart > 100) { + mBeginScale = true; + mScale = mSumScale; + } + else + return true; + } + + mMapPosition.scaleMap(mScale, mFocusX, mFocusY); + mMapView.redrawTiles(); + + return true; + } + + private long mTimeStart; + private long mTimeEnd; + private float mSumScale; + + @Override + public boolean onScaleBegin(ScaleGestureDetector gd) { + mTimeEnd = mTimeStart = SystemClock.elapsedRealtime(); + mSumScale = 1; + mBeginScale = false; + mCenterX = mMapView.getWidth() >> 1; + mCenterY = mMapView.getHeight() >> 1; + mScale = 1; + // mMapPosition = mMapView.getMapPosition(); + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector gd) { + // Log.d("ScaleListener", "Sum " + mSumScale + " " + (mTimeEnd - mTimeStart)); + + if (mTimer == null && mTimeEnd - mTimeStart < 150 + && (mSumScale < 0.99 || mSumScale > 1.01)) { + + mPrevScale = 0; + + mZooutOut = mSumScale < 0.99; + + mTimer = new CountDownTimer((int) mScaleDuration, 30) { + @Override + public void onTick(long tick) { + scale(tick); + } + + @Override + public void onFinish() { + scale(0); + + } + }.start(); + } + } + + private DecelerateInterpolator mBounce = new DecelerateInterpolator(); + private float mPrevScale; + private CountDownTimer mTimer; + boolean mZooutOut; + private final float mScaleDuration = 350; + + boolean scale(long tick) { + + if (mPrevScale >= 1) { + mTimer = null; + return false; + } + + float adv = (mScaleDuration - tick) / mScaleDuration; + adv = mBounce.getInterpolation(adv); + + float scale = adv - mPrevScale; + mPrevScale += scale; + + if (mZooutOut) { + mMapPosition.scaleMap(1 - scale, 0, 0); + } else { + mMapPosition.scaleMap(1 + scale, mFocusX, mFocusY); + } + + mMapView.redrawTiles(); + + if (tick == 0) + mTimer = null; + + return true; + } + } } diff --git a/src/org/mapsforge/android/input/ScaleListener.java b/src/org/mapsforge/android/input/ScaleListener.java deleted file mode 100644 index 1ac62d29..00000000 --- a/src/org/mapsforge/android/input/ScaleListener.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2010, 2011, 2012 mapsforge.org - * - * This program is free software: you can redistribute it and/or modify it under the - * terms of the GNU Lesser General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * this program. If not, see . - */ -package org.mapsforge.android.input; - -import org.mapsforge.android.MapView; -import org.mapsforge.android.MapViewPosition; - -import android.os.CountDownTimer; -import android.os.SystemClock; -import android.view.ScaleGestureDetector; -import android.view.animation.DecelerateInterpolator; - -class ScaleListener implements ScaleGestureDetector.OnScaleGestureListener { - private final MapView mMapView; - private MapViewPosition mMapPosition; - private float mCenterX; - private float mCenterY; - private float mFocusX; - private float mFocusY; - private float mScale; - private boolean mBeginScale; - - /** - * Creates a new ScaleListener for the given MapView. - * - * @param mapView - * the MapView which should be scaled. - */ - ScaleListener(MapView mapView) { - mMapView = mapView; - } - - @Override - public boolean onScale(ScaleGestureDetector gd) { - - mScale = gd.getScaleFactor(); - mFocusX = gd.getFocusX() - mCenterX; - mFocusY = gd.getFocusY() - mCenterY; - - mSumScale *= mScale; - - mTimeEnd = SystemClock.elapsedRealtime(); - - if (!mBeginScale) { - if (mTimeEnd - mTimeStart > 100) { - mBeginScale = true; - mScale = mSumScale; - } - else - return true; - } - - mMapPosition.scaleMap(mScale, mFocusX, mFocusY); - mMapView.redrawTiles(); - - return true; - } - - private long mTimeStart; - private long mTimeEnd; - private float mSumScale; - - @Override - public boolean onScaleBegin(ScaleGestureDetector gd) { - mTimeEnd = mTimeStart = SystemClock.elapsedRealtime(); - mSumScale = 1; - mBeginScale = false; - mCenterX = mMapView.getWidth() >> 1; - mCenterY = mMapView.getHeight() >> 1; - mScale = 1; - mMapPosition = mMapView.getMapPosition(); - return true; - } - - @Override - public void onScaleEnd(ScaleGestureDetector gd) { - // Log.d("ScaleListener", "Sum " + mSumScale + " " + (mTimeEnd - mTimeStart)); - - if (mTimer == null && mTimeEnd - mTimeStart < 150 - && (mSumScale < 0.99 || mSumScale > 1.01)) { - - mPrevScale = 0; - - mZooutOut = mSumScale < 0.99; - - mTimer = new CountDownTimer((int) mScaleDuration, 30) { - @Override - public void onTick(long tick) { - scale(tick); - } - - @Override - public void onFinish() { - scale(0); - - } - }.start(); - } - - } - - private DecelerateInterpolator mBounce = new DecelerateInterpolator(); - private float mPrevScale; - private CountDownTimer mTimer; - boolean mZooutOut; - private final float mScaleDuration = 350; - - boolean scale(long tick) { - - if (mPrevScale >= 1) { - mTimer = null; - return false; - } - - float adv = (mScaleDuration - tick) / mScaleDuration; - adv = mBounce.getInterpolation(adv); - - float scale = adv - mPrevScale; - mPrevScale += scale; - - if (mZooutOut) { - mMapPosition.scaleMap(1 - scale, 0, 0); - } else { - mMapPosition.scaleMap(1 + scale, mFocusX, mFocusY); - } - - mMapView.redrawTiles(); - - if (tick == 0) - mTimer = null; - - return true; - } -}