如何部分重绘 canvas 的非矩形部分

How to partially redraw a non-rect shaped part of the canvas

我在 android 中制作了一个自定义折线图视图,我正在尝试实现一种 drag/scroll 函数,根据您所在的位置在 x 轴上拖动一个小圆圈触摸屏幕。

我想知道是否有办法在每次 onTouchEvent 调用时只重绘这个圆圈。 (圆圈是 Drawable 顺便说一句)。我知道我可以用 invalidate(Rect dirty) 使 canvas 的一部分无效,但它现在看起来已被弃用并且无论如何都不起作用,因为我需要保留背景层(线条和网格)

或者,我可以重新绘制每个事件的整个图表...这被认为是不好的做法吗?还是通常是这样做的?

谢谢

推荐的方法是重绘整个视图 canvas。已弃用方法 invalidate(Rect dirty) 的文档提到

The switch to hardware accelerated rendering in API 14 reduced
the importance of the dirty rectangle. In API 21 the given rectangle is
ignored entirely in favor of an internally-calculated area instead.

由于 API >=14 默认启用硬件加速(即使在视图级别),您可以简单地使整个视图无效。

由于硬件加速,对性能的影响非常小。 硬件加速利用显示列表进一步提高性能。

事实上,不用担心使用 invalidate(),您实际上可以注意不要在绘图时执行其他可能影响性能的事情,请参阅: https://developer.android.com/guide/topics/graphics/hardware-accel#tips