SurfaceView мигает черным при загрузке

У меня есть приложение для рисования, которое загружает рисунок для сложных рисунков примерно за 2-5 секунд (выполняется с помощью AsyncTask ). Для лучшего взаимодействия с пользователем в это время я прошиваю сохраненную версию чертежа в формате PNG из каталога приложения как ImageView и показываю загрузку ProgressBar , вызывающую setContentView () в конструкторе Activity:



    

        
    

Когда AsyncTask завершена, я снова вызываю setContentView () с новым макетом:



    

Когда я использовал простая модель Canvas , это работало отлично, так как пользовательский DrawingCanvas View рисовал бы рисунок на экране в исходном onDraw () перед тем, как показать его пользователю. пользователь, но теперь, используя SurfaceView с циклом рисования, я вижу мигающий макет, затем, когда рисунок загружен, черный экран примерно на секунду, а затем, наконец, новый DrawingCanvas.

Я предполагаю, что причина связана со временем запуска потока цикла отрисовки, и я оставил свою замену onDraw () в SurfaceView , и он вызывается, но холст, доступный в onDraw () , похоже, не обращается к SurfaceView . Я также пробовал установить сплошной цвет фона в приведенном выше XML, надеясь, как минимум, показать белый фон, но они, похоже, никогда не влияют, даже устанавливая его из кода.

Какие-либо советы или объяснения того, что я вижу на черном экране?

РЕДАКТИРОВАТЬ:

Хорошо, вы подтвердили, что onDraw () рисует на том же холсте, поэтому оставил там мои операции рисования надеясь, что при первоначальном показе SurfaceView пользователь увидит эти рисунки, как в обычной реализации Canvas, а когда поток рисования развернется, он перезапишет Canvas.

Однако, если я очищу операции рисования потоков, я действительно увижу результаты onDraw (), но опять же ПОСЛЕ мигания черного экрана. И если я полностью удалю переопределение onDraw (), я все равно вижу черную вспышку, а затем я вижу макет с белым фоном из XML.

Итак, похоже, что несмотря ни на что, я всегда буду видеть черный экран, если, возможно, вместо переключения макетов я просто изменю существующий макет «flash», который уже активен?

EDIT2:

Пробовали использовать ViewStub , чтобы я мог надуть SurfaceView в существующий View после загрузки заметки, но та же проблема все еще применяется. Насколько я могу судить, существует значительная задержка (~ 200 мс) между конструктором SurfaceView и вызовом функции surfaceCreated (), но я не уверен, что именно здесь происходит черный экран или почему экран отрисовывается на черный ...

РЕДАКТИРОВАТЬ3:

Моя последняя попытка на данный момент включает в себя сделать SurfaceView прозрачным .Это в сочетании с оставлением существующего макета на месте и простым добавлением в этот макет через ViewStub привело бы к рабочему решению, хотя я, но все же, в течение доли секунды, когда SurfaceView загружает, экран мигает черным перед отображением SurfaceView, как прозрачный. Если у кого-то есть другие идеи, пожалуйста, опубликуйте их.

32
задан Community 23 May 2017 в 12:18
поделиться