Android: Как заставить пользовательское представление перерисовывать частично?

У меня есть пользовательское представление, которое заполняет мой весь экран. (Клавиатура фортепьяно), Когда пользователь касается ключа, он вызывает invalidate() чтобы быть названной и целая клавиатура перерисовывается для показа нового состояния с затронутым ключом.

В настоящее время представление очень просто, но я планирую добавить немного более хорошую графику. Так как целая клавиатура динамично представляется, это сделало бы перерисовку всей клавиатуры более дорогой.

Таким образом, я думал, давайте изучим частичную перерисовку. Теперь я звоню invalidate(Rect dirty) с корректным грязным регионом. Я установил мой onDraw(Canvas canvas) метод, чтобы только потянуть ключи в грязном регионе, если я действительно хочу частичную перерисовку. Это приводит к тем оттягиваемым ключам, но остальная часть клавиатуры полностью черная/не оттянутый вообще.

Я нахожусь неправильно в ожидании того вызова invalidate(Rect dirty) "кэшировал" бы ток canvas, и только "позволяет" тянуть в грязном регионе?

Есть ли какой-либо способ, которым я могу достигнуть того, что я хочу? (Способ "кэшировать" холст и только перерисовать грязную область?"

14
задан Peterdk 1 June 2010 в 10:42
поделиться

1 ответ

Текущий хороший обходной путь - вручную кэшировать весь холст в битмап:

 private void onDraw(Canvas canvas)
 {
     if (!initialDrawingIsPerformed)
     {
          this.cachedBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
            Config.ARGB_8888); //Change to lower bitmap config if possible.
          Canvas cacheCanvas = new Canvas(this.cachedBitmap);
          doInitialDrawing(cacheCanvas);
          canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
          initialDrawingIsPerformed = true;
     }
     else
     {
          canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
          doPartialRedraws(canvas);
     }
 }

Конечно, вам нужно хранить информацию о том, что перерисовывать, и желательно не использовать каждый раз новый Paint, но это уже детали.

Также обратите внимание: растровые изображения занимают много памяти в вашем приложении. У меня были сбои, когда я кэшировал View, который использовался со скроллером и который был примерно в 5 раз больше высоты устройства, так как он использовал > 10MB памяти!

19
ответ дан 1 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: