【问题标题】:How to access MyLocationOverlay's canvas?如何访问 MyLocationOverlay 的画布?
【发布时间】:2012-02-03 07:15:37
【问题描述】:

我重写了 MyLocationOverlay 的 drawMyLocation 以显示一个箭头作为标记,而不是普通的蓝点。但是,我还需要根据手机的传感器更改指针指向的方向。我决定在 onSensorChanged 中调用 drawMyLocation。但是调用 drawMyLocation 所需的参数之一是 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;
}

【问题讨论】:

    标签: android google-maps compass-geolocation mylocationoverlay


    【解决方案1】:

    您不应该在 draw() 方法之外访问画布。如果你发现自己需要绘制或使用画布,你应该重写 draw() 方法。

    使用 onSensonrChanged 方法将当前方向或传感器信息保存到您的类状态中,然后覆盖 draw() 方法并使用保存的状态来扩充您的绘图例程。

    【讨论】:

    • 但是,我不确定 draw 方法最初是做什么的,如果有的话,编码它可能会很痛苦。实际上,我尝试寻找 Google 地图 API。才发现它不是开源的。此外,覆盖 draw 方法并不能保证一旦传感器发生变化就会始终调用它。你知道是什么触发了draw方法吗?能否提供 draw 方法的代码,以便我知道它最初的作用?
    • 每次更新窗口都会调用draw方法。这种情况每秒发生 15-30 次,并且可能比传感器更频繁地发生 4 到 5 个数量级。当您覆盖 draw 方法时,您调用 super.draw() 作为第一步,它允许现有代码首先进行绘制,然后在此之上进行绘制。当然,我的代码和你一样少,但我可以向你保证,在 draw() 方法控制的范围之外绘制到画布不是解决方案。
    • 谢谢!我也对在不同的方法上调用 drawMyLocation 方法表示怀疑。我仍然担心的一件事是,每次调用 draw 方法时,我都需要创建一个新的旋转位图。由于实例化一个新对象会导致大量内存,所以会不会太占用资源?
    • 您加载位图一次,您可以使用画布上可用的平移和旋转方法根据当前情况将位图以不同的方式应用到画布上。 Canvas 文档中有大量信息。
    • 我刚刚尝试覆盖 draw 方法。我不知道为什么,但即使我可以看到它正在连续执行,也需要一段时间才能看到箭头旋转。它只是突然改变了它的方向。我在上面添加了我的代码。同时,我还没有探索使用 Canvas 旋转图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多