android canvas - 我可以有多种绘制方法吗?

时间:2011-07-25 17:52:51

标签: android android-canvas draw ondraw

我制作了自己的canvas类,扩展了imageView。我的onDraw()方法绘制用户gps位置,每次用户移动时我都会继续调用onDraw方法。我的问题是我还想绘制一个只需要绘制一次的gps路径(当用户移动时不需要更新)。我想知道是否有可能有超过1个onDraw方法或有什么方法可以分离1)用户位置和2)gps跟踪?

我的理由是,每次用户gps位置更改时,我都不想通过重新绘制gps路径来浪费内存。这是一种浪费。

3 个答案:

答案 0 :(得分:1)

你见过表演受到打击吗?如果没有,请不要担心。我认为这会浪费CPU周期,如果有的话......不是内存。因此,如果应用程序看起来已经足够快,请不要担心优化它。

如果您的应用程序有点滞后,并且您发现该路径是瓶颈......我建议将其缓存到位图中。这样,您仍然需要绘制轨迹,但您不必计算每个帧上轨迹的坐标。

答案 1 :(得分:1)

我最近不得不解决一个类似的问题,我会简要解释一下,如果有任何帮助,我会做些什么。

您可以使用多个重叠视图,其中一个可能包含您不想经常重绘的背景图形,以及包含经常更新的图形的前景视图。然后,为了获得性能,您可以设计背景View onDraw(),以便它由Bitmap支持,然后您将其保留为类变量。在您的背景图形的第一个onDraw()中,您对Canvas进行相对较慢的绘制。在后续调用onDraw()时,您只需将该位图绘制到Canvas。

我自己就是这样做的。基本上我的应用程序所做的是显示许多图形仪表。这些仪表有很多只绘制一次的图形(仪表面,数字图例),以及随着模型数据的变化需要反复重绘的指针图形。首先,我将背景图形分割并将前景图形移动到单独的重叠视图中。现在,无效并重新绘制前景指针图形当然会导致它重叠的任何内容无效,因此每次重绘指针视图时都会调用背景图形视图的onDraw()方法。背景视图只需要绘制一次背景图形,但保留支持画布的位图,并在随后的onDraw()调用中将此位图绘制回Canvas(这比使用Path创建图形要快很多) ()对象)。

Bitmap bm;


....

protected void onDraw(Canvas canvas){
    if(null==bm){
        bm=Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(),Bitmap.Config.ARGB_8888);
        // do your slow vector graphics drawing to Canvas here
    }
    Paint drawPaint = new Paint();
    drawPaint.setAntiAlias(false);
    drawPaint.setFilterBitmap(false);
    drawPaint.setDither(false);
    canvas.drawBitmap(bm, 0, 0, drawPaint);
}

答案 2 :(得分:0)

好吧,假设我正确理解你的问题,那么onDraw方法不能超过1个。您将需要考虑有关如何处理此问题的替代方法。

@DeeV建议,这可以为您提供解决方案。