У меня есть приложение для рисования, которое занимает около 2-5 секунд, чтобы загрузить чертеж для сложных рисунков (сделанных через AsyncTask
). Для лучшего пользовательского опыта, в течение этого времени я прошить сохраненную версию PNG рисунка у меня есть из каталога приложений в качестве ImageView
, и показать погрузочную ProgressBar
Calling setContentView()
в конструкторе активности:SurfaceView мигает черным при загрузке
<?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
бы нарисовать рисунок на осыпь n на начальном onDraw()
перед его показом пользователю, но теперь используя SurfaceView
с контуром рисования, я вижу свернутый макет, затем, когда загружается чертеж, черный экран около секунды, а затем, наконец, новый DrawingCanvas.
Я предполагаю, что причина связана с временем запуска нити петли рисунка, и я оставил свой overide из onDraw()
в SurfaceView
, и он вызывается, но холст доступен в onDraw()
не похоже, обращаются к SurfaceView
. Я также попытался установить сплошной цвет фона в XML выше, надеясь, как минимум, на белый фон, но они никогда не влияют, даже устанавливая его из кода.
Любые советы или объяснения того, что я вижу с помощью черного экрана?
EDIT:
Хорошо, подтвердил, что OnDraw() приближается к тому же холсту, так что оставил свои отрисовки опы там, а также в надежде, что на начальном показе SurfaceView, пользователь будет видеть эти рисунки как в обычной реализации Canvas, и когда поток чертежа развернулся, он заменит Canvas.
Однако, если я очищаю операции нити чертежа, я вижу результаты onDraw(), но снова ПОСЛЕ ЧЕРНОЙ ФУНКЦИИ. И если я полностью отключу onDraw(), я все равно вижу черную вспышку, а затем вижу макет с белым фоном из XML.
Так что, похоже, что бы я ни был, я всегда буду видеть черный экран, если, возможно, вместо переключения макетов я просто модифицирую существующий макет «flash», который уже активен?
EDIT2:
Пытались с помощью ViewStub, так что я могу надуть SurfaceView в существующий вид после загрузки обратите внимание, но тот же ISSU еще применяется. Насколько я могу судить, существует значительная (~ 200 мс) задержка между конструктором SurfaceView и вызовом функции surfaceCreated(), но не уверен, что это то, где происходит черный экран, или почему экран рисуется черный ...
EDIT3:
Моя последняя попытка сейчас включает в себя делает SurfaceView transparent. Это в сочетании с оставлением существующего макета на месте и просто добавлением к этому макету через ViewStub привело бы к созданию рабочего решения, хотя, тем не менее, но в течение секунды секунды, когда SurfaceView загружается, экран мигает черным цветом до отображения SurfaceView, как прозрачный. Если у кого есть какие-то другие идеи, попробуйте, разместите их.
Некоторые тяжелые операции в onCreate могут дать такие результаты. – Ronnie
Я показываю макет 'flash' в onCreate(), без задержки. Задержка/черный экран появляется после загрузки чертежа, и я запускаю SurfaceView, который включает только начальный поток. –
Можем ли мы увидеть источник вашего класса DrawingCanvas? –