package org.osmdroid.samplefragments.events;
import org.osmdroid.samplefragments.BaseSampleFragment;
import org.osmdroid.util.BoundingBox;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.Projection;
import org.osmdroid.views.overlay.Overlay;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
/**
*
* @author Marc Kurtz
*
*/
public class SampleLimitedScrollArea extends BaseSampleFragment {
// ===========================================================
// Constants
// ===========================================================
public static final String TITLE = "Limited scroll area";
private final int MENU_LIMIT_SCROLLING_ID = Menu.FIRST;
private BoundingBox sCentralParkBoundingBox;
private Paint sPaint;
// ===========================================================
// Fields
// ===========================================================
private ShadeAreaOverlay mShadeAreaOverlay;
public SampleLimitedScrollArea()
{
sCentralParkBoundingBox = new BoundingBox(40.796788,
-73.949232, 40.768094, -73.981762);
sPaint = new Paint();
sPaint.setColor(Color.argb(50, 255, 0, 0));
}
@Override
public String getSampleTitle() {
return TITLE;
}
// ===========================================================
// Constructors
// ===========================================================
@Override
protected void addOverlays() {
super.addOverlays();
final Context context = getActivity();
mShadeAreaOverlay = new ShadeAreaOverlay();
mMapView.getOverlayManager().add(mShadeAreaOverlay);
setLimitScrolling(true);
setHasOptionsMenu(true);
}
protected void setLimitScrolling(boolean limitScrolling) {
if (limitScrolling) {
mMapView.getController().setZoom(15);
mMapView.setScrollableAreaLimitDouble(sCentralParkBoundingBox);
mMapView.setMinZoomLevel(15);
mMapView.setMaxZoomLevel(18);
mMapView.getController().animateTo(sCentralParkBoundingBox.getCenter());
mShadeAreaOverlay.setEnabled(true);
mMapView.invalidate();
} else {
mMapView.setScrollableAreaLimit(null);
mMapView.setMinZoomLevel(null);
mMapView.setMaxZoomLevel(null);
mShadeAreaOverlay.setEnabled(false);
mMapView.invalidate();
}
}
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods from SuperClass/Interfaces
// ===========================================================
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add(0, MENU_LIMIT_SCROLLING_ID, Menu.NONE, "Limit scrolling").setCheckable(true);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(MENU_LIMIT_SCROLLING_ID);
item.setChecked(mMapView.getScrollableAreaLimit() != null);
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_LIMIT_SCROLLING_ID:
setLimitScrolling(mMapView.getScrollableAreaLimit() == null);
return true;
}
return false;
}
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
class ShadeAreaOverlay extends Overlay {
final GeoPoint mTopLeft;
final GeoPoint mBottomRight;
final Point mTopLeftPoint = new Point();
final Point mBottomRightPoint = new Point();
Rect area=null;
public ShadeAreaOverlay() {
super();
mTopLeft = new GeoPoint(sCentralParkBoundingBox.getLatNorth(),
sCentralParkBoundingBox.getLonWest());
mBottomRight = new GeoPoint(sCentralParkBoundingBox.getLatSouth(),
sCentralParkBoundingBox.getLonEast());
}
@Override
public void draw(Canvas c, MapView osmv, boolean shadow) {
if (shadow)
return;
final Projection proj = osmv.getProjection();
if (area==null) {
proj.toPixels(mTopLeft, mTopLeftPoint);
proj.toPixels(mBottomRight, mBottomRightPoint);
area = new Rect(mTopLeftPoint.x, mTopLeftPoint.y, mBottomRightPoint.x,
mBottomRightPoint.y);
}
c.drawRect(area, sPaint);
}
}
}