Рисование фона окна с помощью действия на основе холста - PullRequest
1 голос
/ 31 января 2011

Итак Я выяснил , как правильно установить фон «Деятельности», чтобы я мог показывать «поддельное» фоновое изображение пользователю во время загрузки «Активности», согласно этой записи блога Romain.Guy .Я могу убедиться, что это работает, загрузив тестовый макет в запущенном Activity, и я знаю, что фоновое изображение устанавливается.

Моя проблема заключается в следующем: у меня есть ListView, который запускает Activity, которая может занять до 5секунд (в довольно редких случаях), чтобы нарисовать несколько фигур в пользовательском представлении через canvas и onDraw.Когда пользователь выбирает элемент из ListView, экран просто сидит там, показывая ListView, ожидая 2 - 5 секунд, пока идет рисование.Некоторые детали:

XML-файл Activity, 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.

Итак, у меня такое ощущение, что представление «Деятельности» не отображается, потому что рисунок на холсте использует поток пользовательского интерфейса ... Я попытался переместить чертеж в onResume, надеясь, что в «Деятельности» будет нарисован макет с надутыми данными.в onCreate сначала ДО вызывался onResume, но не играли в кости.Я хотел бы, чтобы это произошло:

  1. Пользователь нажимает на элемент ListView
  2. Запускается действие, показывая «поддельное» фоновое изображение
  3. Упражнение обращается на холст
  4. Canvas рисует для просмотра, отображая его для пользователя

Что происходит:

  1. Пользователь нажимает на элемент ListView
  2. Экрансидит на ListView, в то время как действие рисует на холст
  3. Вид с нарисованным холстом отображается пользователю

Я также думал об использовании AsyncTask для рисования, и, возможно, этоздесь правильное решение, но мы стараемся сделать это как можно более простым, поскольку на самом деле для очень больших наборов чертежей задержка действительно велика, что я ожидаю довольно редко.

Спасибо,

Пол

РЕДАКТИРОВАТЬ:

По вопросу Ромен, некоторые подробности о doDrawing ().doDrawing () открывает файл XML, считывает некоторые данные, которые описывают различные формы пути, а затем отправляет эти данные в CanvasView с помощью открытого метода addPath ():

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();
}
}

Наконец, в методе onDraw в CanvasView onDraw проходит по циклу через ArrayList mPaths, записывая каждый из путей на холст.

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Что именно делает doDrawing ()?Чтобы вызвать метод OnDraw (), необходимо передать Canvas.Какой холст вы используете?Единственный способ получить доступ к Canvas на экране - это использовать Canvas, который вы получаете, когда draw (Canvas) / dispatchDraw (Canvas) / onDraw (Canvas) вызываются автоматически.

Кроме того, что вы пытаетесь сделатьделать просто не получится.Перед рисованием видов система удаляет содержимое окна.Вы не можете рисовать на холсте только один раз, вы должны делать это на каждом кадре (каждый раз, когда рисуете

0 голосов
/ 06 апреля 2011

Мое решение этой проблемы заключается в использовании AsyncTask , загрузке простого «всплывающего» представления в onPreExecute(), вызове doDrawing() в doInBackground(), а затем скрытии «всплывающего» представленияonPostExecute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...