【发布时间】:2014-03-29 01:25:45
【问题描述】:
我正在扩展我的根布局,这样我就可以在上面drawBitmap 4 个箭头,一个在屏幕的每个角落。这些箭头偶尔会同时闪烁。
我这样做是为了优化以避免创建 4 个额外的视图,所以我想只有在这些区域独立无效时才有意义,因为如果整个布局无效并重新绘制,性能损失可能会大于节省,因为根布局包含沉重的东西。我想这是个好主意,但如果有人认为不是,请告诉我原因。
我尝试在同一个函数中对每个矩形调用 invalidate(Rect):
public MyRootViewGroup extends FrameLayout {
@Override
public void draw (Canvas c) {
super.draw(c); // Draw Viewgroup Children
draw_arrows(); // Paint Arrows over children
invalidate(rect_arrow_left);
invalidate(rect_arrow_right);
invalidate(rect_arrow_bottom);
invalidate(rect_arrow_top);
}
...但不幸的是,这种方法似乎只有一个区域无效。我需要使整个布局无效才能使其正常工作。
问题如果此 FrameLayout 包含其他子项(在 super.draw() 中绘制)但它们没有改变,我对 invalidate() 的调用会导致它们全部被重新绘制吗?或者Android在某种程度上很聪明地检测到尽管触发了完整的invalidate,但只有箭头区域发生了变化?我是在优化并保存 4 个视图,还是在破坏 Android 优化管道?
问候!
【问题讨论】:
标签: android performance android-layout canvas invalidation