Я расширяю свой корневой макет, чтобы разместить на нем 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?
С Уважением!