package org.osmdroid.views.overlay.gestures;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.IOverlayMenuProvider;
import org.osmdroid.views.overlay.Overlay;
import android.content.Context;
import android.graphics.Canvas;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
public class RotationGestureOverlay extends Overlay implements
RotationGestureDetector.RotationListener, IOverlayMenuProvider
{
private final static boolean SHOW_ROTATE_MENU_ITEMS = false;
private final static int MENU_ENABLED = getSafeMenuId();
private final static int MENU_ROTATE_CCW = getSafeMenuId();
private final static int MENU_ROTATE_CW = getSafeMenuId();
private final RotationGestureDetector mRotationDetector;
private MapView mMapView;
private boolean mOptionsMenuEnabled = true;
/** use {@link #RotationGestureOverlay(MapView)} instead. */
@Deprecated
public RotationGestureOverlay(Context context, MapView mapView) {
this(mapView);
}
public RotationGestureOverlay(MapView mapView)
{
super();
mMapView = mapView;
mRotationDetector = new RotationGestureDetector(this);
}
@Override
public void draw(Canvas c, MapView osmv, boolean shadow) {
// No drawing necessary
}
@Override
public boolean onTouchEvent(MotionEvent event, MapView mapView)
{
if (this.isEnabled()) {
mRotationDetector.onTouch(event);
}
return super.onTouchEvent(event, mapView);
}
long timeLastSet=0L;
final long deltaTime=25L;
float currentAngle=0f;
@Override
public void onRotate(float deltaAngle)
{
currentAngle+=deltaAngle;
if (System.currentTimeMillis() - deltaTime > timeLastSet){
timeLastSet = System.currentTimeMillis();
mMapView.setMapOrientation(mMapView.getMapOrientation() + currentAngle);
}
}
@Override
public void onDetach(MapView map){
mMapView=null;
}
@Override
public boolean isOptionsMenuEnabled()
{
return mOptionsMenuEnabled;
}
@Override
public boolean onCreateOptionsMenu(Menu pMenu, int pMenuIdOffset, MapView pMapView)
{
pMenu.add(0, MENU_ENABLED + pMenuIdOffset, Menu.NONE, "Enable rotation").setIcon(
android.R.drawable.ic_menu_info_details);
if (SHOW_ROTATE_MENU_ITEMS) {
pMenu.add(0, MENU_ROTATE_CCW + pMenuIdOffset, Menu.NONE,
"Rotate maps counter clockwise").setIcon(android.R.drawable.ic_menu_rotate);
pMenu.add(0, MENU_ROTATE_CW + pMenuIdOffset, Menu.NONE, "Rotate maps clockwise")
.setIcon(android.R.drawable.ic_menu_rotate);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem pItem, int pMenuIdOffset, MapView pMapView)
{
if (pItem.getItemId() == MENU_ENABLED + pMenuIdOffset) {
if (this.isEnabled()) {
mMapView.setMapOrientation(0);
this.setEnabled(false);
} else {
this.setEnabled(true);
return true;
}
} else if (pItem.getItemId() == MENU_ROTATE_CCW + pMenuIdOffset) {
mMapView.setMapOrientation(mMapView.getMapOrientation() - 10);
} else if (pItem.getItemId() == MENU_ROTATE_CW + pMenuIdOffset) {
mMapView.setMapOrientation(mMapView.getMapOrientation() + 10);
}
return false;
}
@Override
public boolean onPrepareOptionsMenu(final Menu pMenu, final int pMenuIdOffset, final MapView pMapView)
{
pMenu.findItem(MENU_ENABLED + pMenuIdOffset).setTitle(
this.isEnabled() ? "Disable rotation" : "Enable rotation");
return false;
}
@Override
public void setOptionsMenuEnabled(boolean enabled)
{
mOptionsMenuEnabled = enabled;
}
}