gpt4 book ai didi

android - 使用基于 Canvas 的 Activity 绘制窗口背景

转载 作者:行者123 更新时间:2023-11-29 22:29:13 25 4
gpt4 key购买 nike

所以 I figured out根据 this blog post by Romain Guy 设置 Activity 背景的正确方法,以便我可以在 Activity 加载时向用户显示“假”背景图像.我可以通过在启动的 Activity 上加载测试布局来验证它是否有效,所以我知道正在设置背景图像。

我的问题是:我有一个 ListView,它启动一个 Activity,该 Activity 最多可能需要 5 秒(在极少数情况下)通过 Canvas 和 onDraw 将多个形状绘制到自定义 View 。当用户从 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。

所以,我的感觉是 Activities 的 View 没有显示,因为 Canvas 绘图正在使用 UI 线程......我尝试将绘图移动到 onResume,希望 Activity 会首先绘制在 onCreate 中膨胀的布局在调用 onResume 之前,但没有骰子。我想要发生的是:

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

发生了什么:

  1. 用户点击 ListView 项
  2. 屏幕位于 ListView 上,而 Activity 绘制到 Canvas 上
  3. 向用户显示绘制 Canvas 的 View

我也曾考虑过使用 AsyncTask 来进行绘图,也许这就是正确的解决方案,但我希望尽可能简单,因为对于非常大的绘图集,实际上只有延迟,我希望如此相当罕见。

谢谢,

保罗

编辑:

根据 Romain 的问题,关于 doDrawing() 的一些细节。 doDrawing() 打开一个 XML 文件,读取一些描述各种路径形状的数据,然后通过公共(public)方法 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写入 Canvas 。

最佳答案

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

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

关于android - 使用基于 Canvas 的 Activity 绘制窗口背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4855144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com