package org.pyneo.tabulae.locus; /* * Copyright © 2015 Himal Rai (initial implementation from https://groups.google.com/forum/#!topic/mapsforge-dev/BS-b3q5XAa0) * Copyright © 2015 Emux (valuable hints) * Copyright © 2015 M. Dietrich (cleanup, simplification) */ import org.mapsforge.core.graphics.Bitmap; import org.mapsforge.core.graphics.Canvas; import org.mapsforge.core.model.BoundingBox; import org.mapsforge.core.model.LatLong; import org.mapsforge.core.model.Point; import org.mapsforge.core.model.Rectangle; import org.mapsforge.core.util.MercatorProjection; import org.mapsforge.map.android.graphics.AndroidGraphicFactory; import org.mapsforge.map.layer.overlay.Marker; class RotatingMarker extends Marker { protected float degree = 0.0f; protected float px = 0.0f; protected float py = 0.0f; public RotatingMarker(LatLong latLong, Bitmap bitmap, int horizontalOffset, int verticalOffset) { super(latLong, bitmap, horizontalOffset, verticalOffset); } @Override public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas, Point topLeftPoint) { if (getLatLong() == null || getBitmap() == null) { return; } long mapSize = MercatorProjection.getMapSize(zoomLevel, displayModel.getTileSize()); double pixelX = MercatorProjection.longitudeToPixelX(getLatLong().longitude, mapSize); double pixelY = MercatorProjection.latitudeToPixelY(getLatLong().latitude, mapSize); int halfBitmapWidth = getBitmap().getWidth() / 2; int halfBitmapHeight = getBitmap().getHeight() / 2; int left = (int) (pixelX - topLeftPoint.x - halfBitmapWidth + getHorizontalOffset()); int top = (int) (pixelY - topLeftPoint.y - halfBitmapHeight + getVerticalOffset()); int right = left + getBitmap().getWidth(); int bottom = top + getBitmap().getHeight(); Rectangle bitmapRectangle = new Rectangle(left, top, right, bottom); Rectangle canvasRectangle = new Rectangle(0, 0, canvas.getWidth(), canvas.getHeight()); if (!canvasRectangle.intersects(bitmapRectangle)) { return; } android.graphics.Canvas androidCanvas = AndroidGraphicFactory.getCanvas(canvas); androidCanvas.save(); androidCanvas.rotate(degree, (float) (pixelX - topLeftPoint.x), (float) (pixelY - topLeftPoint.y)); canvas.drawBitmap(getBitmap(), left, top); androidCanvas.restore(); } public RotatingMarker setDegree(float degree) { this.degree = degree; return this; } public RotatingMarker setPivotPoint(float px, float py) { this.px = px; this.py = py; return this; } }