0

Я написал операцию, которая показывает только один пользовательский вид.Частичная аннулирование Android частично отображает весь просмотр, пока аппаратное ускорение

Вид просто нарисуйте случайный цвет и аннулированию меньшую область, и сделать случайный цвет, и недействительным даже меньший регион, и так далее ...

Ожидаемый результат должен быть как this. Он отлично работает, используя программный рендеринг, и getClipBounds() возвращает область, в которую я только что перешел в недействительный. Но когда аппаратное ускорение включено, весь вид всегда перерисовывается новым цветом, а getClipBounds() возвращает область всего представления.

Я знаю, что есть такие должности, как this и this. Ответы сказали, что getClipBounds() возвращает область всего представления с аппаратным ускорением, но перерисовываются только те, которые пересекают грязную область.

Есть ли что-то неправильно или мое недоразумение?

public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    // random color 
    int color = Color.rgb((int) (Math.random() * 255), 
      (int) (Math.random() * 255), (int) (Math.random() * 255)); 

    canvas.drawColor(color); 

    canvas.getClipBounds(rect); 

    // smaller dirty region 
    invalidate(0, 0, rect.width() - 1, rect.height() - 1); 
} 
+0

Это похоже на ошибку/недостаток в Android. Весь вид всегда перерисовывается, и производительность соответственно. То, что я делал в этих случаях, - это создать сетку представлений, которые входят в родительское представление, и родитель достаточно умен, чтобы неправильно отображать дочерние представления в сетке и отправлять им нужную часть растрового изображения для рисования. – jjxtra

ответ

1

К сожалению, это ограничение аппаратного ускорения Android, по крайней мере, из Android 5. Invalidate Прямоугольник игнорируется, и весь вид всегда перерисовывается, требуя, чтобы сделать всю область. Если вы попытаетесь сделать только часть представления, все остальное, что было нарисовано в представлении, исчезнет.

Я читал сообщения, в которых утверждается, что Android не перерисовывает весь вид, а только часть, которая изменилась, но это кажется неправильным, потому что когда я пытаюсь отобразить только область, которая была в rect, что я передан в недействительный, сброс представления исчезает. Если бы правда, что Android только повторно отобразил измененную область, я бы ожидал, что остальная часть пользовательского чертежа в представлении останется видимой.

iOS имеет намного лучшую производительность с помощью метода drawRect и setNeedsDisplayInRect. Я ожидал, что Android будет работать одинаково, но, увы, этого не произойдет.