我正在创建一个 Android 应用程序,它本质上是一个仪表板,上面有许多仪表和指示器。我有一个主视图,它添加到主活动的 onCreate() 方法中。每个仪表都是一个自定义 View 对象,它在主视图中添加和初始化,并在主视图的 onDraw() 方法中绘制。仪表值由在 Main Activity 的 onCreate() 方法中启动的各个线程不断更新。当线程检测到需要更改仪表值时,它会这样做,然后(通过消息处理程序)向主视图发送一条消息,告诉它需要更新(重绘)特定仪表。我在主视图的消息处理程序中使用 invalidate() 来刷新屏幕。该应用程序运行良好,但我想知道我是否尽可能高效地处理显示更新。我的问题是:
当我在主视图中调用 invalidate() 时,我假设它正在重绘所有仪表视图,即使是那些没有改变的视图。如果是这样,重新绘制已更改的仪表视图会更有效吗?最好的方法是什么?我曾尝试调用单个视图的 invalidate() 和 postInvalidate() 方法,但都不起作用。
根据要求,这里是主视图中 onDraw 方法的当前状态。最终将添加更多的仪表。边框是静态的,只有在设备切换配置(横向/纵向)时才会改变。各种仪表是从扩展 View 的 Gauge 类实例化的:
@Override
protected void onDraw(Canvas canvas) {
speedoBezel.draw(canvas);
tachBezel.draw(canvas);
oilPressBezel.draw(canvas);
oilTempBezel.draw(canvas);
speedoGauge.draw(canvas);
tachGauge.draw(canvas);
oilPressGauge.draw(canvas);
oilTempGauge.draw(canvas);
}
好的,我已经阅读了很多在 Android 中制作动画的方法,我开始将它们混合在一起。我想重新表述这个问题:
如果我正在开发一个应用程序,其主视图中有许多不同的对象,这些对象经常更改但间隔不同,那么执行以下操作是否会更好:
将对象添加到主视图并使用主视图中的 invalidate(rect) 根据需要单独更新它们,或者
将每个对象添加到 Layout 并在需要更新时在每个视图上使用 invalidate。
重要的是要注意没有对象重叠