Мои приветствия всем кто зашел в эту тему.
Столкнулся со следующей проблемой - После вызова postInvalidate() у вьюва, в методе onDraw() рисовать приходится на уже отчищенной конве. Хотелось бы начать рисовать на том что осталось от предыдущего кадра. Подходящего set'а, такого что бы можно было убрать заливку фоновым цветом, не нашел. Если не найду подходящий механизм придется либо отказаться от собственного кэша (как надеюсь более оптимизированный чем вьювовский) либо отказаться от самого вьюва, т.е. начать работать с графикс2Д, буфередИмедж и т.д. Т.е. практически начать весь проект сначала.
Вообщем кто что может подсказать в этом направлении?
postInvalidate()
Re: postInvalidate()
вам нужно запоминать все отрисовки и отрисовывать их каждый раз при onDraw
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: postInvalidate()
В текущий момент так и делается. На каждую операцию рисования уходит пропорционально количеству перерисовываемых пикселей время, вплоть до 70 мс если рисуется весь экран (на моем телефоне, видавшем виды), попытка внедрить clip оборачивается провалом, потому что postInvalidate() очищает слой вьюва от того что на нем было нарисовано, и клип зона прорисовывается одиноко в чистом поле, вместо того что бы изменить лишь содержимое клипа, оставив остальное как есть. Могло бы помочь postInvalideate(rect), но в том месте где он должен вызываться (действительно там и ни где иначе) о том какую область перерисовывать неизвестно
Re: postInvalidate()
Если кому то интересно как рисовать на остатках конвы, то есть такой метод: поверхность на которой рисуем GameSurface наследуем от SurfaceView, в нужном нам месте вызываем:
Canvas viewCanvas=GameSurface.getHolder().lockCanvas();
viewCanvas.clipRect(dirty); //выделяем область которую хотим перерисовать
//(по своим соображениям кладем в Rect dirty область которую все таки надо перерисовать)
draw(viewCanvas); // вызываем отрисовку
GameSurface.getHolder().unlockCanvasAndPost(viewCanvas);
В отличие от postInvalidate(Rect r) вполне возможно что отрисовка начнется почти сразу, или с задержкой максимум 5 мс (используя postInvalidate ждать отрисовки после вызова приходится неизвестное время не меньше 10мс, в среднем 15мс)
Метод хорош, но есть заморочка. На моем девайсе (а может и на всех, не знаю, и хтелось бы знать если честно) стоит своп буфер(swapBuffer) поэтому приходящая от локКанва() канва чередуется от одного буфера к другому, приходится изощряться объединяя области перерисовки, иначе приходится наблюдать забавные артефакты дергания и мерцания
Canvas viewCanvas=GameSurface.getHolder().lockCanvas();
viewCanvas.clipRect(dirty); //выделяем область которую хотим перерисовать
//(по своим соображениям кладем в Rect dirty область которую все таки надо перерисовать)
draw(viewCanvas); // вызываем отрисовку
GameSurface.getHolder().unlockCanvasAndPost(viewCanvas);
В отличие от postInvalidate(Rect r) вполне возможно что отрисовка начнется почти сразу, или с задержкой максимум 5 мс (используя postInvalidate ждать отрисовки после вызова приходится неизвестное время не меньше 10мс, в среднем 15мс)
Метод хорош, но есть заморочка. На моем девайсе (а может и на всех, не знаю, и хтелось бы знать если честно) стоит своп буфер(swapBuffer) поэтому приходящая от локКанва() канва чередуется от одного буфера к другому, приходится изощряться объединяя области перерисовки, иначе приходится наблюдать забавные артефакты дергания и мерцания