Как получить доступ к холсту MyLocationOverlay?

Я переопределяю drawMyLocation MyLocationOverlay, чтобы отображать стрелку в качестве маркера вместо обычной синей точки. Однако мне также нужно изменить направление, на которое указывает указатель, в зависимости от датчика телефона. Я решил вызвать drawMyLocation внутри onSensorChanged. Но одним из параметров, необходимых для вызова drawMyLocation, является Canvas. Как я могу получить доступ к холсту MyLocationOverlay? Или мне нужно создать новый Canvas и передавать новый Canvas каждый раз, когда я вызываю drawMyLocation внутри onSensorChanged?

Ниже приведен мой код, когда я пытался переопределить метод рисования. Однако, несмотря на то, что я вижу, что он непрерывно выполнялся, для отображения повернутого растрового изображения требуется некоторое время.

**ОБНОВЛЕНИЕ: если я попытаюсь коснуться своей карты, я увижу, как моя стрелка вращается, когда я касаюсь карты. Однако, если я не прикоснусь к нему, стрелке потребуется некоторое время, чтобы обновить свое направление.

public boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when) 
{
    Log.v("Message", "Executing draw method...");        
    boolean result;        
    result = super.draw(canvas, mapView, shadow, when);

    if(geoLastFix != null) //geoLastFix contains the GeoPoint of my Location.
    {
        Point screenPts = mapView.getProjection().toPixels(geoLastFix, null);

        //rotate bitmap
        Bitmap arrowBitmap = marker;
        Matrix matrix = new Matrix();           
        matrix.postRotate(orientation);
        Bitmap rotatedBmp = Bitmap.createBitmap(
            arrowBitmap, 
            0, 0, 
            arrowBitmap.getWidth(), 
            arrowBitmap.getHeight(), 
            matrix, 
            true
        );
       //print bitmap to canvas
        canvas.drawBitmap(
            rotatedBmp, 
            screenPts.x - (rotatedBmp.getWidth()  / 2), 
            screenPts.y - (rotatedBmp.getHeight() / 2), 
            null
        );
    }        
    return result;
}

person Arci    schedule 03.02.2012    source источник


Ответы (1)


Вы не должны обращаться к холсту вне метода draw(). Если вам нужно рисовать или использовать холст, вы должны переопределить метод draw().

Используйте метод onSensorChanged, чтобы сохранить текущую ориентацию или информацию о датчике в состоянии вашего класса, а затем переопределите метод draw() и используйте сохраненное состояние для расширения вашей процедуры рисования.

person Nick Campion    schedule 03.02.2012
comment
Тем не менее, я не уверен, что изначально делает метод draw, и может быть сложно кодировать все, что он делает, если вообще когда-либо. На самом деле, я пытался найти API карты Google. Только чтобы узнать, что это не было с открытым исходным кодом. Кроме того, переопределение метода рисования не гарантирует, что он всегда будет вызываться при изменении датчика. Знаете ли вы, что вызывает метод рисования? Можете ли вы предоставить код метода рисования, чтобы я мог знать, что он делает изначально? - person Arci; 03.02.2012
comment
метод рисования будет вызываться каждый раз при обновлении окна. Это происходит порядка 15-30 раз в секунду и, вероятно, на 4-5 порядков чаще, чем датчик будет меняться. Когда вы переопределяете метод отрисовки, вы вызываете super.draw() в качестве первого шага, который позволяет существующему коду сначала выполнить отрисовку, а затем вы рисуете поверх нее. У меня, конечно, так же мало кода, как и у вас, но я могу заверить вас, что рисование на холсте за пределами области, контролируемой методом draw(), не является решением. - person Nick Campion; 03.02.2012
comment
Спасибо! У меня также есть сомнения по поводу вызова метода drawMyLocation для другого метода. Одна вещь, которая меня все еще беспокоит, заключается в том, что мне нужно создавать новое повернутое растровое изображение каждый раз, когда вызывается метод рисования. Не будет ли это слишком ресурсоемким, поскольку создание экземпляра нового объекта требует много памяти? - person Arci; 03.02.2012
comment
Вы загружаете растровое изображение один раз и можете использовать методы перевода и поворота, доступные на холсте, чтобы по-разному применять растровое изображение к холсту в зависимости от текущей ситуации. В документах Canvas есть целая куча информации. - person Nick Campion; 03.02.2012
comment
Я только что попытался переопределить метод рисования. Я не уверен, почему, но хотя я вижу, что он постоянно выполняется, требуется некоторое время, чтобы увидеть, как стрелка вращается. Он просто внезапно меняет свою ориентацию. Я добавил свой код выше. В то же время я еще не исследовал вращение изображения с помощью Canvas. - person Arci; 03.02.2012
comment
вы можете переместить всю часть, отмеченную поворотом растрового изображения, за пределы рисунка. Это должно ускорить ваш код. Кроме того, когда вы получаете изменение ориентации, вы должны вызвать недействительность, чтобы убедиться, что представление перерисовано. - person Nick Campion; 03.02.2012