【发布时间】:2012-02-05 01:40:04
【问题描述】:
我有一个绘图应用程序,加载复杂绘图的绘图大约需要 2-5 秒(通过 AsyncTask 完成)。为了获得更好的用户体验,在此期间,我将存储的 PNG 版本的图形从 app 目录中刷新为 ImageView,并在 Activity 构造函数中显示调用 setContentView() 的加载 ProgressBar:
<?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() 上将绘图绘制到屏幕上,但现在使用 @ 987654334@ 带有绘图循环,我看到闪烁的布局,然后在加载绘图时,黑屏大约一秒钟,最后是新的 DrawingCanvas。
我假设原因与绘图循环线程的启动时间有关,并且我将onDraw() 的覆盖留在了SurfaceView 中,它被调用了,但是画布在onDraw() 似乎没有吸引到SurfaceView。我还尝试在上面的 XML 中设置纯色背景,希望至少显示白色背景,但这些似乎从未生效,即使从代码中设置也是如此。
对我在黑屏中看到的内容有何建议或解释?
编辑:
好的,已经确认 onDraw() 正在绘制到同一个画布上,所以将我的绘制操作留在了那里,同时希望在 SurfaceView 的初始显示时,用户会像在常规 Canvas 实现中一样看到这些绘图,当绘图线程启动时,它会覆盖画布。
但是,如果我清除绘图线程操作,我确实会看到 onDraw() 结果,但同样是在黑屏闪烁之后。如果我完全删除 onDraw() 覆盖,我仍然会看到黑色闪烁,然后我会看到 XML 中带有白色背景的布局。
所以,看起来无论如何,我总是会看到黑屏,除非我可能不是切换布局,而是简单地修改已经处于活动状态的现有“flash”布局?
EDIT2:
尝试使用ViewStub,以便在加载注释后将 SurfaceView 膨胀到现有视图中,但同样的问题仍然适用。据我所知,SurfaceView 构造函数和对 surfaceCreated() 的调用之间存在相当大的延迟(约 200 毫秒),但不确定这是黑屏发生的地方,或者屏幕被绘制到的原因黑...
EDIT3:
我现在的最后一次尝试包括制作SurfaceView transparent。这与保留现有布局并简单地通过 ViewStub 添加到该布局相结合,虽然会产生一个可行的解决方案,但是,当 SurfaceView 正在加载时,屏幕会在显示 SurfaceView 之前闪烁黑色,一样透明。如果有人有任何其他想法可以尝试,请发布。
【问题讨论】:
-
onCreate 中的一些繁重操作可能会产生这样的结果。
-
我在 onCreate() 中显示了“flash”布局,没有延迟。加载绘图并启动 SurfaceView 后出现延迟/黑屏,这仅涉及启动线程。
-
我们可以查看您的 DrawingCanvas 类的源代码吗?
-
很遗憾,由于法律限制,我只能发布小片段以外的任何内容。
标签: android surfaceview android-canvas