Android google maps groundoverlay

#android #google-maps #overlay

#Android #google-карты #наложение

Вопрос:

В API javascript google maps вы можете добавить groundoverlay и просто передать две точки: точку lefttoplatamp; lefttoplong и точку rightbottomlatamp; rightbottomlong… (Обычные наложения не остаются между этими двумя точками, но остаются того же размера при увеличении или уменьшении масштаба.)

Я искал что-то подобное в Android Google Maps api, но нигде не могу его найти. Есть ли такая вещь в API карт Android, и если ее нет, каков наилучший способ имитации этой функции?

Комментарии:

1. Не уверен, когда была добавлена поддержка GroundOverlays в Google Maps Android API, но она доступна сейчас. В API есть класс с именем «GroundOverlay», который выполняет именно то, что делает эквивалентный javascript API. Вот ссылка .

Ответ №1:

Это лучше. Использование метода рисования гарантирует, что вы рисуете только ту часть растрового изображения, которая фактически находится на экране. Иногда я все еще получаю ошибку превышения бюджета виртуальной машины. Я все еще изучаю это.

 public class GroundOverlay extends Overlay {
    Bitmap original;
    Bitmap resized;
    int lastZoomlevel;
    SnowmapsOverlayObject snowmapsObject;
    public static Boolean DRAW = false;
    GeoPoint topGeoPoint;
    GeoPoint bottomGeoPoint;

    OnReady _onReady = null;

    Boolean ready = false;

    public GroundOverlay(Bitmap original, SnowmapsOverlayObject snowmapsObject) {
        this.original = Bitmap.createScaledBitmap(original, original.getWidth(), original.getHeight(), true);
        this.snowmapsObject = snowmapsObject;

        topGeoPoint = new GeoPoint((int) ((snowmapsObject.topLat).doubleValue() * 1E6), (int) ((snowmapsObject.topLng).doubleValue() * 1E6));
        bottomGeoPoint = new GeoPoint((int) ((snowmapsObject.bottomLat).doubleValue() * 1E6), (int) ((snowmapsObject.bottomLng).doubleValue() * 1E6));
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
            super.draw(canvas, mapView, false);

            Projection projection = mapView.getProjection();

            Point leftTop = new Point();
            Point rightTop = new Point();
            Point rightBottom = new Point();
            Point leftBottom = new Point();

            projection.toPixels(topGeoPoint, leftTop);
            projection.toPixels(new GeoPoint(topGeoPoint.getLatitudeE6(), bottomGeoPoint.getLongitudeE6()), rightTop);
            projection.toPixels(bottomGeoPoint, rightBottom);
            projection.toPixels(new GeoPoint(bottomGeoPoint.getLatitudeE6(), topGeoPoint.getLongitudeE6()), leftBottom);

            if (
                    (leftTop.x < 0 || leftTop.y < 0) amp;amp; 
                    (rightTop.x < 0 || rightTop.y < 0) amp;amp; 
                    (rightBottom.x < 0 || rightBottom.y < 0) amp;amp; 
                    (leftBottom.x < 0 || leftBottom.y < 0)) {
                // Not on screen? Don't draw the overlay
                return;
            }

            //      GeoPoint mapCenter = mapView.getMapCenter();
            Paint paint = new Paint();
            paint.setFilterBitmap(true);
            paint.setAntiAlias(true);

            canvas.drawBitmap(original, null, new Rect(leftTop.x, leftTop.y, rightBottom.x, rightBottom.y), paint);

            if (!ready amp;amp; _onReady != null) {
                ready = true;
                _onReady.done();
            }
    }


    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
        super.onTouchEvent(e, mapView);

        if (e.getAction() == MotionEvent.ACTION_UP) {
            setDrawTrue();
        }

        return false;
    }

    private void setDrawTrue() {
        DRAW = true;
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                DRAW = false;
            }
        }, 100);
    }

    public void setOnReady(OnReady onReady) {
        this._onReady = onReady;
    }

    public interface OnReady {
        public void done();
    }
}
  

Комментарии:

1. Спасибо, но это все еще напрасно, изображения огромны, с которыми я работаю. Мне нужен способ обрезать изображение

Ответ №2:

Исправил это сам.

Для всех, у кого такая же проблема, вот мой код:

 public class GroundOverlay extends OverlayItem {

    private MapView map;
    private Bitmap overlay;
    private GeoPoint topGeoPoint;
    private GeoPoint bottomGeoPoint;

    public Drawable drawable;

    public GroundOverlay(
            MapView map, 
            GeoPoint topLeftGeoPoint, 
            GeoPoint bottomRightGeoPoint, 
            Bitmap overlay,
            String title, 
            String snippet) {
        super(bottomRightGeoPoint, title, snippet);

        this.map = map;
        this.overlay = overlay;
        this.topGeoPoint = topLeftGeoPoint;
        this.bottomGeoPoint = bottomRightGeoPoint;

        _init();
    }

    private void _init() {
        Point topPoint = new Point();
        Point bottomPoint = new Point();

        map.getProjection().toPixels(topGeoPoint, topPoint);
        map.getProjection().toPixels(bottomGeoPoint, bottomPoint);

        int width = bottomPoint.x - topPoint.x;
        int height = bottomPoint.y - topPoint.y;

        drawable = overlayDrawable(overlay, width, height);
    }

    public BitmapDrawable overlayDrawable(Bitmap bitmap, int newWidth, int newHeight) {
        Matrix scale = new Matrix();

        float scaleFloat = (float)newWidth / (float)bitmap.getWidth();

        scale.postScale(scaleFloat, scaleFloat);
        Bitmap bitmapScaled = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), scale, false);

        BitmapDrawable bm = new BitmapDrawable(bitmapScaled);
        bm.setBounds(0,0,bitmapScaled.getWidth(),bitmapScaled.getHeight());

        return bm;
    }

}
  

Вам нужно будет где-то использовать setMarker (drawable), и он должен работать. Я делаю это где-то в другом месте (отсюда и общедоступный рисунок).

Комментарии:

1. Я пробовал это, но я получаю VMBudget превышает ошибку. Есть какой — нибудь способ решить эту проблему?

2. Я тоже это понимаю. Не на моем собственном телефоне, а на телефоне одного из моих коллег. Но я также обнаружил, что мне следует использовать метод рисования, который немного помогает. Смотрите мой новый ответ для нового кода.