0

MyLocationOverlayのdrawMyLocationをオーバーライドして、通常の青い点の代わりにマーカーとして矢印を表示します。ただし、電話のセンサーによっては、ポインターが指す方向も変更する必要があります。onSensorChanged内でdrawMyLocationを呼び出すことにしました。ただし、drawMyLocationを呼び出すために必要なパラメーターの1つはCanvasです。MyLocationOverlayのキャンバスにアクセスするにはどうすればよいですか?または、onSensorChanged内でdrawMyLocationを呼び出すたびに、新しいCanvasを作成して新しいCanvasを渡す必要がありますか?

以下は、drawメソッドをオーバーライドしようとしたときのコードです。ただし、継続的に実行されていることがわかりますが、回転したビットマップが表示されるまでに時間がかかります。

**更新:マップをタッチしようとすると、マップをタッチすると矢印が回転するのがわかります。ただし、触らないと矢印が方向を更新するのに時間がかかります。

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;
}
4

1 に答える 1

1

draw()メソッドの外部でキャンバスにアクセスしないでください。描画を実行したり、キャンバスを使用したりする必要がある場合は、draw()メソッドをオーバーライドする必要があります。

onSensonrChangedメソッドを使用して、現在の方向またはセンサー情報をクラス状態に保存してから、draw()メソッドをオーバーライドし、保存された状態を使用して描画ルーチンを拡張します。

于 2012-02-03T07:36:30.730 に答える