我制作了自己的画布类,它扩展了一个 imageView。我的 onDraw() 方法绘制出用户的 gps 位置,每次用户移动时我都会调用这个 onDraw 方法。我的问题是我还想画出只需要画一次的gps轨迹(用户移动时不需要更新)。我想知道是否有可能有超过 1 个 onDraw 方法,或者有什么方法可以分离 1)用户位置和 2)gps 轨迹?
我的原因是我不想在每次用户 gps 位置更改时重新绘制 gps 路线来浪费内存。这是一种浪费。
我制作了自己的画布类,它扩展了一个 imageView。我的 onDraw() 方法绘制出用户的 gps 位置,每次用户移动时我都会调用这个 onDraw 方法。我的问题是我还想画出只需要画一次的gps轨迹(用户移动时不需要更新)。我想知道是否有可能有超过 1 个 onDraw 方法,或者有什么方法可以分离 1)用户位置和 2)gps 轨迹?
我的原因是我不想在每次用户 gps 位置更改时重新绘制 gps 路线来浪费内存。这是一种浪费。
我最近不得不解决一个类似的问题,如果有任何帮助,我将简要解释一下我做了什么。
您可以做的是使用多个重叠的视图,其中一个可能包含您不想经常重绘的背景图形,以及一个包含经常更新的图形的前景视图。然后,为了获得性能,您可以设计背景视图onDraw()
,使其由位图支持,然后您将其保留为类变量。在onDraw()
您的第一个背景图形中,您对 Canvas 进行了相对较慢的绘制。在随后的调用中onDraw()
,您只需将该位图绘制到 Canvas。
我自己刚刚做了这个。基本上我的应用程序所做的是显示许多图形仪表。这些仪表有许多只绘制一次的图形(仪表面、数字图例),以及随着模型数据的变化需要反复重绘的指针图形。首先,我将背景图形和移动前景图形拆分为单独的重叠视图。现在,使前景指针图形失效和重绘当然会导致它重叠的任何东西也失效,因此onDraw()
每次重绘指针视图时都会调用背景图形视图的方法。背景View只需要绘制一次背景图形,但保留了支持canvas的Bitmap,在后续的onDraw()
调用它将这个位图绘制回画布(这比最初使用 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);
}
你见过性能受到打击吗?如果没有,请不要担心。我认为这将浪费 CPU 周期,如果有的话......不是内存。因此,如果应用程序看起来已经足够快,请不要担心对其进行优化。
如果您的应用程序有点滞后,并且您发现路径是瓶颈......我建议将其缓存到位图中。这样,您仍然需要绘制轨迹,但您不必计算每一帧上轨迹的坐标。
好吧,假设我正确理解了您的问题,onDraw 方法不能超过 1 个。您将需要考虑如何处理此问题的替代方法。
@DeeV 建议,这可能是您的解决方案。