Android Open Source - Mapyst On Map Touch Limiter Listener






From Project

Back to project page Mapyst.

License

The source code is released under:

Apache License

If you think the Android project Mapyst listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 Mapyst//  w  w  w  .  ja v a  2 s  .  c o  m
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.mapyst.android.ui.map;

import java.util.Timer;
import java.util.TimerTask;

import android.graphics.Rect;
import android.os.SystemClock;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;

public class OnMapTouchLimiterListener implements OnTouchListener {

  // ================================================================
  public boolean limiting = false; // SETS WHETHER THE MAP IS LIMITED
  // ================================================================

  private MapView map;
  private Rect bounds;

  private boolean repairing = false;

  private static final int repairSpeed = 250;

  private int lastProbDirX = 0; // -1 left, 1 right
  private int lastProbDirY = 0; // -1 up, 1 down

    private Timer timer;

    private GeoPoint campusCenter;

  private long lastRepair = 0;
  private long startRepair = 0;

  private boolean endTouch = false;

  private float lastX;
  private float lastY;

  private class Repairer extends TimerTask {
    public void run() {
      if (MapViewLimiter.outOfBounds(map, bounds)  || (repairing && MapViewLimiter.outOfBounds(map, bounds, 3f))) {
        if (SystemClock.uptimeMillis() - lastRepair > 200)
          startRepair = SystemClock.uptimeMillis();
        if (SystemClock.uptimeMillis() - startRepair > 2000) { // jump to fix
          GeoPoint newCenter = campusCenter;
          map.getController().setCenter(newCenter);
        } else { // gradual fix
          endTouch = true;
          repairing = true;
          map.getController().stopPanning();
          try {
            if (MapViewLimiter.tooFarOut(map, bounds)) {
              map.getController().zoomIn();
            } else { // at this point we know its a center issue
              float dlat = campusCenter.getLatitudeE6() - map.getMapCenter().getLatitudeE6();
              float dlong = campusCenter.getLongitudeE6()  - map.getMapCenter().getLongitudeE6();
              float dist = (float) Math.pow(Math.pow(dlat, 2)  + Math.pow(dlong, 2), .5);
              dlat /= dist;
              dlong /= dist;
              dlat = repairSpeed * dlat;
              dlong = repairSpeed * dlong;

              if (Math.abs(dlong) > 100) {
                if (dlong > 0)
                  lastProbDirX = -1;
                else
                  lastProbDirX = 1;
              } else
                lastProbDirX = 0;
              if (Math.abs(dlat) > 100) {
                if (dlat > 0)
                  lastProbDirY = 1;
                else
                  lastProbDirY = -1;
              } else
                lastProbDirY = 0;

              GeoPoint newCenter = new GeoPoint(map.getMapCenter().getLatitudeE6()
                  + (int) dlat, map.getMapCenter().getLongitudeE6() + (int) dlong);
              map.getController().setCenter(newCenter);
            }
            lastRepair = SystemClock.uptimeMillis();
          } catch (java.lang.IllegalStateException e) {
            e.printStackTrace();
          }
        }
                int timerShortDelay = 20;
                timer.schedule(new Repairer(), timerShortDelay);
      } else {
        repairing = false;
                int timerLongDelay = 500;
                timer.schedule(new Repairer(), timerLongDelay);
      }
    }
  }

  public OnMapTouchLimiterListener(MapView map, Rect bounds) {
    this.map = map;
    this.bounds = bounds;
    timer = new Timer();
    campusCenter = new GeoPoint(bounds.centerY(), bounds.centerX());
  }

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    if (!limiting)
      return false;

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      endTouch = false;
    }
    if (endTouch)
      return true;

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      lastX = event.getX();
      lastY = event.getY();
    } else {
      if (repairing || SystemClock.uptimeMillis() - lastRepair < 500) {
        if (lastProbDirX == Math.signum(lastX - event.getX())
            || lastProbDirY == Math.signum(lastY - event.getY())) {
          return true;
        }
      }
      lastX = event.getX();
      lastY = event.getY();
    }

    if (MapViewLimiter.outOfBounds(map, bounds)) {
      timer.schedule(new Repairer(), 0);
      return true;
    }

    return false;
  }
}




Java Source Code List

com.mapyst.FileHandlerInterface.java
com.mapyst.android.AndroidFileHandler.java
com.mapyst.android.CampusLoader.java
com.mapyst.android.Compass.java
com.mapyst.android.DirectionsList.java
com.mapyst.android.Images.java
com.mapyst.android.LocationFinder.java
com.mapyst.android.MainScreen.java
com.mapyst.android.Mapyst.java
com.mapyst.android.Settings.java
com.mapyst.android.Splash.java
com.mapyst.android.asynctask.CampusLoaderTaskPrefs.java
com.mapyst.android.asynctask.CampusLoaderTask.java
com.mapyst.android.asynctask.RouteMakerTaskPrefs.java
com.mapyst.android.asynctask.RouteMakerTask.java
com.mapyst.android.ui.CenteredToastFactory.java
com.mapyst.android.ui.CompassOverlay.java
com.mapyst.android.ui.DirectionIcon.java
com.mapyst.android.ui.DirectionsListAdapter.java
com.mapyst.android.ui.DirectionsListItem.java
com.mapyst.android.ui.DrawingHelpers.java
com.mapyst.android.ui.Icon.java
com.mapyst.android.ui.LocationsAdapter.java
com.mapyst.android.ui.LocationsListView.java
com.mapyst.android.ui.RouteMapOverlay.java
com.mapyst.android.ui.SlidingScrollView.java
com.mapyst.android.ui.map.AnimatedMapZoomer.java
com.mapyst.android.ui.map.LocationBalloon.java
com.mapyst.android.ui.map.LocationChooserOverlay.java
com.mapyst.android.ui.map.MapUtils.java
com.mapyst.android.ui.map.MapViewLimiter.java
com.mapyst.android.ui.map.MapViewMover.java
com.mapyst.android.ui.map.OnMapTouchLimiterListener.java
com.mapyst.android.ui.map.PriorityMapView.java
com.mapyst.android.ui.map.ViewItemOverlay.java
com.mapyst.campus.Building.java
com.mapyst.campus.Campus.java
com.mapyst.campus.Floor.java
com.mapyst.campus.ListOfCampuses.java
com.mapyst.campus.Location_Type.java
com.mapyst.campus.Location.java
com.mapyst.route.Arc.java
com.mapyst.route.DataParser.java
com.mapyst.route.Direction.java
com.mapyst.route.DistanceCalculator.java
com.mapyst.route.GraphNode.java
com.mapyst.route.InterpretResult.java
com.mapyst.route.InterpretedInfo.java
com.mapyst.route.Interpreter.java
com.mapyst.route.LatLngPoint.java
com.mapyst.route.Prioritizable.java
com.mapyst.route.PriorityQ.java
com.mapyst.route.RouteFinder.java
com.mapyst.route.RoutePreferences.java
com.mapyst.route.Route.java
com.mapyst.route.ShortestPath.java
com.mapyst.route.Waypoint2D.java
com.mapyst.route.WaypointID.java
com.markupartist.android.widget.ActionBar.java
com.markupartist.android.widget.ScrollingTextView.java