У меня есть приложение для рисования, которое занимает около 2-5 секунд, чтобы загрузить рисунок для сложных рисунков (выполняется через AsyncTask
).Для удобства пользователей в это время я прошил сохраненную версию чертежа в формате PNG из каталога приложения как ImageView
и показываю загрузку ProgressBar
, вызывающую setContentView()
в конструкторе Activity:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/flash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@color/note_bg_white"
android:contentDescription="@string/content_desc_flash_img"
android:focusable="false" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:gravity="bottom|center_vertical">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/toolbar_progress"
android:layout_width="match_parent"
android:layout_height="18dp"
android:gravity="bottom|center_vertical" />
</RelativeLayout>
</FrameLayout>
Когда AsyncTask
завершен, я затем снова вызываю setContentView()
с новым макетом:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<com.my.package.DrawingCanvas
android:id="@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:background="#ffffff" />
</RelativeLayout>
Когда я использовал простую модель Canvas
, это работало отлично, так какПользовательский DrawingCanvas View
будет рисовать чертеж на экране в начальном onDraw()
перед тем, как его показывать пользователю, но теперь, используя SurfaceView
с циклом рисования, я вижу всплывающий макет, затем, когда чертежзагружен, черный экран примерно на секунду, затем наконец новый DrawingCanvas.
Я предполагаю, что причина связана со временем запуска потока цикла рисования, и я оставил свой оверид onDraw()
в SurfaceView
, и он вызывается, нохолст, доступный в onDraw()
, кажется, не обращается к SurfaceView
.Я также попытался установить сплошной цвет фона в XML выше, надеясь как минимум показать белый фон, но, похоже, они никогда не влияют, даже устанавливая его из кода.
Любой совет или объяснение того, что я вижу на черном экране?
РЕДАКТИРОВАТЬ:
Хорошо, подтвердили, что onDraw () рисует на том же холсте,поэтому я оставил там мои операции рисования, надеясь, что при первоначальном отображении SurfaceView пользователь увидит эти рисунки, как в обычной реализации Canvas, а когда поток рисования раскрутится, он перезапишет Canvas.
Однако, если я очищаю операции потока рисунка, я вижу результаты onDraw (), но снова, ПОСЛЕ черного экрана.И если я полностью удаляю переопределение onDraw (), я все еще вижу черную вспышку, а затем я вижу макет с белым фоном из XML.
Итак, похоже, что независимо от того, что я всегда идучтобы увидеть черный экран, если, возможно, вместо переключения макетов я просто изменяю существующий макет «flash», который уже активен?
EDIT2:
Попытался использовать ViewStub, чтобы я мог накачать SurfaceView в существующий вид после загрузки заметки, но та же проблема по-прежнему применяется.Насколько я могу судить, существует значительная (~ 200 мс) задержка между конструктором SurfaceView и выполнением вызова функции surfaceCreated (), но не уверен, что именно здесь происходит черный экран или почему экран рисуется вчерный ...
EDIT3:
Моя последняя попытка на данный момент включает в себя создание прозрачного SurfaceView .Это в сочетании с оставлением существующего макета на месте и простым добавлением к этому макету с помощью ViewStub привело бы к рабочему решению, хотя, но все же, в течение доли секунды, когда SurfaceView загружается, экран мигает черным перед отображением SurfaceView,как прозрачныйЕсли у кого-то есть другие идеи, пожалуйста, опубликуйте их.