У меня есть пользовательское представление, которое заполняет мой весь экран. (Клавиатура фортепьяно), Когда пользователь касается ключа, он вызывает invalidate()
чтобы быть названной и целая клавиатура перерисовывается для показа нового состояния с затронутым ключом.
В настоящее время представление очень просто, но я планирую добавить немного более хорошую графику. Так как целая клавиатура динамично представляется, это сделало бы перерисовку всей клавиатуры более дорогой.
Таким образом, я думал, давайте изучим частичную перерисовку. Теперь я звоню invalidate(Rect dirty)
с корректным грязным регионом. Я установил мой onDraw(Canvas canvas)
метод, чтобы только потянуть ключи в грязном регионе, если я действительно хочу частичную перерисовку. Это приводит к тем оттягиваемым ключам, но остальная часть клавиатуры полностью черная/не оттянутый вообще.
Я нахожусь неправильно в ожидании того вызова invalidate(Rect dirty)
"кэшировал" бы ток canvas
, и только "позволяет" тянуть в грязном регионе?
Есть ли какой-либо способ, которым я могу достигнуть того, что я хочу? (Способ "кэшировать" холст и только перерисовать грязную область?"
Текущий хороший обходной путь - вручную кэшировать весь холст в битмап:
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 памяти!