使用基于画布的活动绘制窗口背景

时间:2011-01-31 19:31:43

标签: android background android-layout

所以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被召唤之前,但没有骰子。我想要发生的是:

  1. 用户点击ListView项目
  2. 活动启动,显示'假'背景图片
  3. 活动绘制到画布
  4. Canvas绘制到View,将其显示给用户
  5. 发生了什么:

    1. 用户点击ListView项目
    2. 当活动绘制到画布
    3. 时,屏幕位于ListView上
    4. 向用户显示带有绘制画布的视图
    5. 我还考虑过使用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写入画布。

2 个答案:

答案 0 :(得分:2)

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

此外,你想要做的事情是行不通的。在绘制视图之前,系统会擦除窗口的内容。你不能只画一次Canvas,你必须在每一帧画画(每次画画

答案 1 :(得分:0)

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