4

我找到了这个小示例代码,用手指画图:http:
//marakana.com/tutorials/android/2d-graphics-example.html

以下是一些相关代码:

List<Point> points = new ArrayList<Point>();

@Override
public void onDraw(Canvas canvas) {
    for (Point point : points) {
        canvas.drawCircle(point.x, point.y, 5, paint);
    }
}

public boolean onTouch(View view, MotionEvent event) {
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    points.add(point);
    invalidate();
    Log.d(TAG, "point: " + point);
    return true;
}

我正在查看它,看到他们正在向 ArrayList 添加点,然后循环遍历 ArrayList,这似乎不是一种非常优化的方法。有更好的方法还是这是一个好方法?

在我的三星 GS3 上测试后,我用 20 的圆圈大小为整个屏幕上色,越接近全彩色,绘制速度就越慢,然后圆圈之间的距离越来越远。

4

2 回答 2

1

首先,使用描边(不是圆圈)来画线。二、近似。这是一个摘要:

  1. 更改Paint为使用带有 的笔划width=5。这减少了绘制这么多圆圈的需要。
  2. 选择一个阈值,例如,在该阈值3px之后您将在 中添加一个点onTouch()

    if (Math.abs(previousX - event.getX()) < THRESHOLD
            && Math.abs(previousY - event.getY()) < THRESHOLD) {
        return;
    }
    previousX = event.getX();
    previousY = event.getY();
    // drawing update goes here
    

    这应该会减少(不引人注意的)点数。

  3. 使用PictureorPath类画线,并使用Canvas.drawPath()or Canvas.drawPicture()。这,特别是对于大量的点,将真正加快绘图速度,因为所有绘图命令都将在一次调用中传递给内部绘图函数。

  4. 根据需要简化形状。例如,您可以删除最旧的点(这将是使用循环缓冲区的完美案例),使用Ramer-Douglas-Peucker 算法,该算法非常容易实现,结果良好且复杂度为O(nlogn).

于 2012-12-23T06:17:45.867 回答
1

不,这在这个例子中是有意义的。

他遍历所有他想画的点。这意味着他将每个点都添加到数组中,因此他可以一次循环遍历所有对象。

你会经常在游戏编程中看到这一点。


这也是非常可扩展的。

  1. 您可以根据需要添加任意数量的点
  2. 它支持多态性
  3. 您不必为多个点创建变量 > 更少的代码
于 2012-12-23T01:10:37.613 回答