All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mapbox.mapboxsdk.overlay.SafeDrawOverlay Maven / Gradle / Ivy

package com.mapbox.mapboxsdk.overlay;

import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import com.mapbox.mapboxsdk.views.MapView;
import com.mapbox.mapboxsdk.views.safecanvas.ISafeCanvas;
import com.mapbox.mapboxsdk.views.safecanvas.SafeTranslatedCanvas;
import com.nineoldandroids.view.ViewHelper;

/**
 * An overlay class that uses the safe drawing canvas to draw itself and can be zoomed in to high
 * levels without drawing issues.
 *
 * @see {@link ISafeCanvas}
 */
public abstract class SafeDrawOverlay extends Overlay {

    private static final SafeTranslatedCanvas sSafeCanvas = new SafeTranslatedCanvas();
    private static final Matrix sMatrix = new Matrix();
    private boolean mUseSafeCanvas = true;

    protected abstract void drawSafe(final ISafeCanvas c, final MapView mapView,
            final boolean shadow);

    public SafeDrawOverlay() {
        super();
    }

    @Override
    protected void draw(final Canvas c, final MapView mapView, final boolean shadow) {

        sSafeCanvas.setCanvas(c);

        if (this.mUseSafeCanvas) {

            // Find the screen offset
            Rect screenRect = mapView.getProjection().getScreenRect();
            sSafeCanvas.xOffset = -screenRect.left;
            sSafeCanvas.yOffset = -screenRect.top;

            // Save the canvas state
            c.save();

            if (mapView.getMapOrientation() != 0) {
                // Un-rotate the maps so we can rotate them accurately using the safe canvas
                c.rotate(-mapView.getMapOrientation(), screenRect.exactCenterX(),
                        screenRect.exactCenterY());
            }

            // Since the translate calls still take a float, there can be rounding errors
            // Let's calculate the error, and adjust for it.
            final int floatErrorX = screenRect.left - (int) (float) screenRect.left;
            final int floatErrorY = screenRect.top - (int) (float) screenRect.top;

            // Translate the coordinates
            final float scaleX = ViewHelper.getScaleX(mapView);
            final float scaleY = ViewHelper.getScaleY(mapView);
            c.translate(screenRect.left * scaleX, screenRect.top * scaleY);
            c.translate(floatErrorX, floatErrorY);

            if (mapView.getMapOrientation() != 0) {
                // Safely re-rotate the maps
                sSafeCanvas.rotate(mapView.getMapOrientation(), (double) screenRect.exactCenterX(),
                        (double) screenRect.exactCenterY());
            }
        } else {
            sSafeCanvas.xOffset = 0;
            sSafeCanvas.yOffset = 0;
        }

        this.drawSafe(sSafeCanvas, mapView, shadow);

        if (this.mUseSafeCanvas) {
            c.restore();
        }
    }

    public boolean isUsingSafeCanvas() {
        return mUseSafeCanvas;
    }

    public void setUseSafeCanvas(boolean useSafeCanvas) {
        mUseSafeCanvas = useSafeCanvas;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy