Отображение Android на карте - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь отобразить настраиваемое рисование на виде карты, но я могу наблюдать очень странное поведение: рисование рисуется несколько раз, а худшее - неправильно. Кроме того, этот графический объект отлично подходит для ImageView, но не для наложения MapView ...

enter image description here

Вот мой пользовательский рисунок:

public class CustomDrawable extends Drawable {
    private Bitmap mBitmap;
    private int mWidth;
    private int mHeight;
    private int mDrawLeft;
    private int mDrawTop;
    private int mColor;

    public ChatIconDrawable(Resources res, int color) {
        this.mColor = color;
        this.mBitmap = BitmapFactory.decodeResource(res, R.drawable.chat_icon);
        this.mWidth = mBitmap.getWidth();
        this.mHeight = mBitmap.getHeight();
        setBounds(-mWidth, -mHeight, 0, 0);
    }

    @Override
    public void draw(Canvas canvas) {
        ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
        shapeDrawable.getPaint().setColor(mColor);
        shapeDrawable.setBounds(2 - mWidth, 3 - mHeight, mWidth - 2 - mWidth, mHeight - mHeight / 4 - mHeight);
        shapeDrawable.draw(canvas);
        canvas.drawBitmap(mBitmap, mDrawLeft, mDrawTop, null);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.OPAQUE;
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        mDrawLeft = left + (right - left - mWidth) / 2;
        mDrawTop = top + (bottom - top - mHeight) / 2;
    }

    @Override
    public void setBounds(Rect bounds) {
        super.setBounds(bounds);
    }

    @Override
    public void setAlpha(int alpha) {
//      throw new UnsupportedOperationException(
//              "Not supported with this drawable");
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public void setDither(boolean dither) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public void setFilterBitmap(boolean filter) {
//      throw new UnsupportedOperationException("Not supported with this drawable");
    }

    @Override
    public int getIntrinsicWidth() {
        return mWidth;
    }

    @Override
    public int getIntrinsicHeight() {
        return mHeight;
    }

    @Override
    public int getMinimumWidth() {
        return mWidth;
    }

    @Override
    public int getMinimumHeight() {
        return mHeight;
    }
}

По сути, пользовательский объект рисования рисует фон некоторым цветом (он может отличаться), а затем рисует на верхнем статическом растровом изображении для получения правильной фигуры.

Чтобы нарисовать это на карте, я использую ItemizedOverlay.

Как вы можете заметить, проблема заключается в том, что этот чертеж рисуется несколько раз и с разным размещением ... пожалуйста, совет, потому что мне не ясно, что не так. Спасибо.

1 Ответ

0 голосов
/ 18 марта 2011

Забудьте класс CustomDrawable.Когда вы используете этот (или любой другой объект для рисования) в ItemizedOverlay, оверлей будет нести ответственность за рисование своего «маркера» на карте.Маркер устанавливается с помощью вызова OverlayItem.setMarker (Drawable marker).Итак, помимо наложения на рисование маркера, ваш пользовательский класс также рисует его (в методе draw ()).Расположение маркера можно отрегулировать в оверлее, обычно в конструкторе пользовательского наложения, используя, например,

super(boundCenter(defaultMarker));

. Это центрирует маркер на географическом местоположении, а не слегка его смещает.

...