首页 > 解决方案 > 如何部分重绘画布的非矩形部分

问题描述

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

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

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

谢谢

标签: javaandroidandroid-canvasandroid-drawable

解决方案


推荐的方法是重绘视图的整个画布。不推荐使用的方法的文档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


推荐阅读