动态绘制图像的最佳方法

时间:2012-01-27 10:52:10

标签: android image dynamic draw surfaceview

我正在创建一个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 :(得分:0)

您可以在视图中创建位图和画布,并根据需要继续绘制到此位图。为了防止点再次被绘制,绘制点的线程应该在绘制时从列表中删除点,或者跟踪最后一个点的索引。

以下是一个包​​含基础知识的示例:

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,并将当前要绘制的点列表传递给它。然后从列表中删除这些点,以便以后不再绘制它们。