【问题标题】:Draw Window Background with a Canvas-Based Activity使用基于 Canvas 的 Activity 绘制窗口背景
【发布时间】: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 之前,但没有骰子。我希望发生的是:

  1. 用户点击 ListView 项
  2. Activity 启动,显示“假”背景图片
  3. Activity 绘制到画布上
  4. Canvas 绘制到 View,将其显示给用户

发生了什么:

  1. 用户点击 ListView 项
  2. 当活动绘制到画布时,屏幕位于 ListView 上
  3. 向用户显示带有画布的视图

我也考虑过使用 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


    【解决方案1】:

    doDrawing() 到底是做什么的?要调用 View 的 onDraw() 方法,您必须传递一个 Canvas。你用的是什么画布?访问屏幕 Canvas 的唯一方法是使用自动调用 draw(Canvas)/dispatchDraw(Canvas)/onDraw(Canvas) 时收到的 Canvas。

    此外,您正在尝试做的事情是行不通的。在绘制视图之前,系统会擦除窗口的内容。你不能只在画布中绘制一次,你必须在每一帧上都这样做(每次绘制

    【讨论】:

    • 我已经为上面的 doDrawing() 添加了代码。它处理一个 XML 文件,提取将以图形方式表示的数据,并将其传递给 CanvasView 方法。然后该方法通过调用 invalidate() 触发 ConvasView.onDraw。
    • 每次调用(方向改变等)时,我都会通过 onDraw 重新绘制视图。
    【解决方案2】:

    我对此问题的解决方案是使用AsyncTask,在onPreExecute() 中加载一个简单的“splash”视图,在doInBackground() 中调用doDrawing(),然后在onPostExecute() 中隐藏“splash”视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多