Итак Я выяснил , как правильно установить фон «Деятельности», чтобы я мог показывать «поддельное» фоновое изображение пользователю во время загрузки «Активности», согласно этой записи блога 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, но не играли в кости.Я хотел бы, чтобы это произошло:
- Пользователь нажимает на элемент ListView
- Запускается действие, показывая «поддельное» фоновое изображение
- Упражнение обращается на холст
- Canvas рисует для просмотра, отображая его для пользователя
Что происходит:
- Пользователь нажимает на элемент ListView
- Экрансидит на ListView, в то время как действие рисует на холст
- Вид с нарисованным холстом отображается пользователю
Я также думал об использовании 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, записывая каждый из путей на холст.