【问题标题】:How to partially redraw a non-rect shaped part of the canvas如何部分重绘画布的非矩形部分
【发布时间】:2021-08-22 09:45:41
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: java android android-canvas android-drawable


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多