Лучший способ нарисовать изображение динамически - PullRequest
1 голос
/ 27 января 2012

Я создаю приложение для Android, которое должно рисовать карту окружения, которое я исследовал с помощью лазерных сканирований. У меня есть текстовый файл со всеми моими данными, например:


index x y
path   0 0 0
path   1 1 0
path   2 2 0

...etc

obstacle 0 10 10
obstacle 1 10 22

..etc

поэтому у меня есть xy координаты того, где я был, и xy препятствий, которые я видел. У меня есть thread, который читает данные из текстового файла и сохраняет эти данные в list.

Другой thread читает это list и рисует все точки, которые ставятся в list до этого момента, следующим образом: thread.

Моя проблема в том, что я не хочу перечитывать все каждый раз, когда чтение thread помещает новые данные в данные list. Есть способ нарисовать что-то вроде растрового изображения и изменить его динамически? Я имею в виду, что каждый раз, когда я читаю какие-то новые данные, я «открываю» растровое изображение, я добавляю к этому новые точки, «закрываю» это растровое изображение и показываю на экране?

что я сейчас делаю, так это читаю весь список в моей функции onDraw() и рисую точку за точкой, но у меня есть 170 000 точек, и это полезная работа, потому что каждый раз, когда точки в прежней позиции у меня есть только несколько новых очков ...

1 Ответ

0 голосов
/ 19 февраля 2012

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

Вот пример, который содержитосновы:

public class myView extends View {

    Bitmap mBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
    Canvas mCanvas = new Canvas(mBitmap);
    Paint mPaint = new Paint();

    public void updateBitmap(List<Point> points) {
        while (!points.isEmpty()) {
            int x = points.get(0).x;
            int y = points.get(0).y;
            mCanvas.drawPoint(x, y, mPaint);
            points.remove(0);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 0, 0, null);
    }
}

Поток, который рисует точки, вызывает updateBitmap, передавая ему текущий список точек для рисования.Эти точки затем удаляются из списка, поэтому они не будут отображаться позже.

...