【发布时间】:2011-04-06 23:39:27
【问题描述】:
所以I figured out 是设置活动背景的正确方法,这样我就可以根据this blog post by Romain Guy 在加载活动时向用户显示“假”背景图像。我可以通过在启动的 Activity 上加载测试布局来验证这是否有效,因此我知道正在设置背景图像。
我的问题是:我有一个 ListView,它启动一个可能需要 5 秒(在相当罕见的情况下)通过画布和 onDraw 将多个形状绘制到自定义视图的 Activity。当用户从 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,希望活动会首先绘制在 onCreate 中膨胀的布局在调用 onResume 之前,但没有骰子。我希望发生的是:
- 用户点击 ListView 项
- Activity 启动,显示“假”背景图片
- Activity 绘制到画布上
- Canvas 绘制到 View,将其显示给用户
发生了什么:
- 用户点击 ListView 项
- 当活动绘制到画布时,屏幕位于 ListView 上
- 向用户显示带有画布的视图
我也考虑过使用 AsyncTask 来进行绘图,也许这是正确的解决方案,但尽量保持简单,因为对于非常大的绘图集实际上只有延迟,我期望相当罕见。
谢谢,
保罗
编辑:
根据 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,将每个 Paths 写入画布。
【问题讨论】:
标签: android background android-layout