java - 如何部分重绘画布的非矩形部分
问题描述
我在android中制作了一个自定义折线图视图,我正在尝试实现一种拖动/滚动功能,根据您触摸屏幕的位置在x轴上拖动一个小圆圈。
我想知道是否有办法在每次onTouchEvent
通话时只重绘这个圆圈。(圆圈是Drawable
顺便说一句)。我知道我可以使画布的一部分无效,invalidate(Rect dirty)
但它现在看起来已被弃用并且无论如何都不会工作,因为我需要保留背景层(线条和网格)
或者,我可以重新绘制每个事件的整个图表......这被认为是不好的做法吗?还是通常是这样做的?
谢谢
解决方案
推荐的方法是重绘视图的整个画布。不推荐使用的方法的文档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
推荐阅读
- c# - 哪个是官方 open xml sdk nuget repo:DocumentFormat.OpenXml 或 Open-XML-SDK?
- python - 我无法提取正确的月份和日期?
- django - Django模板使用'with'添加2个字符串变量
- kotlin - 在 Kotlin 中将枚举字段序列化为 JSON
- java - 如何从 Eclipse 调用层次结构中提取调用图?
- react-native - 从 JSON 值 React Native 中删除重复错误
- javascript - How to display text and a button inlined in react native?
- spring-boot - 在这种情况下,依赖注入如何工作?
- c - 在 C11 中意外地从本地范围返回初始化结构
- android - 尝试隐藏视频流应用下载的视频