所以I figured out设置活动背景的正确方法,以便我可以在加载活动时向用户显示“假”背景图片,每this blog post by Romain Guy。我可以通过在已启动的Activity上加载测试布局来验证这是否有效,因此我知道正在设置背景图像。
我的问题是:我有一个ListView,它启动一个活动,最多可能需要5秒钟(在极少数情况下),通过画布和onDraw将几个形状绘制到自定义视图。当用户从ListView中选择一个项目时,屏幕只是坐在那里显示ListView,等待绘图发生时的2-5秒。一些细节:
Activity的XML,canvas_view.xml:
<?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">
<com.package.name.CanvasView
android:id="@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true" />
</FrameLayout>
在Activity onCreate()中,我给上面的XML充气,在onResume()中,我启动了写入自定义CanvasView的绘图方法:
@Override
protected void onResume() {
super.onResume();
mCanvas = (CanvasView) findViewById(R.id.canvas);
.
.
.
doDrawing();
}
doDrawing()将数据发送到CanvasView类,并触发onDraw类。
所以,我的感觉是没有显示“活动”视图,因为画布绘图正在使用UI线程...我尝试将绘图移动到onResume,希望Activity将首先在onCreate中绘制膨胀的布局在onResume被召唤之前,但没有骰子。我想要发生的是:
发生了什么:
我还考虑过使用AsyncTask进行绘图,也许这是正确的解决方案,但是尽量保持这个简单,因为非常大的绘图集实际上只有延迟,我期望相当罕见。
谢谢,
保
编辑:
Per Romain的问题,关于doDrawing()的一些细节。 doDrawing()打开一个XML文件,读入一些描述各种路径形状的数据,然后通过公共方法addPath()将该数据发送到CanvasView:
private final void doDrawing() {
// open XML file, read data in, package it up into a Path object, path
{snipped}
// send the data to the CanvasView via a public method
mCanvas.addPath(path);
}
现在,在CanvasView中,这是addPath()的代码:
public void addPath(Path path) {
mPaths.add(path);
// do we need to update the CanvasView?
if (mIsVisible) {
invalidate();
}
}
最后,在CanvasView中的onDraw方法中,onDraw循环遍历mPaths ArrayList,将每个Path写入画布。
答案 0 :(得分:2)
doDrawing()究竟做了什么?要调用View的onDraw()方法,必须传递Canvas。你用的是什么画布?你可以访问屏幕Canvas的唯一方法是使用你自动调用draw(Canvas)/ dispatchDraw(Canvas)/ onDraw(Canvas)时收到的Canvas。
此外,你想要做的事情是行不通的。在绘制视图之前,系统会擦除窗口的内容。你不能只画一次Canvas,你必须在每一帧画画(每次画画
)答案 1 :(得分:0)
我对此问题的解决方案是使用AsyncTask,在onPreExecute()
中加载一个简单的“启动”视图,在doDrawing()
中调用doInBackground()
,然后隐藏' '查看onPostExecute()
。