用手指画画

时间:2012-12-23 01:01:30

标签: java android drawing

我找到了这个小样本代码,用手指画画:
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,并且它越接近全彩,绘制的速度就越慢,然后圆圈变得间隔开。

2 个答案:

答案 0 :(得分:1)

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

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

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


这也非常容易扩展。

  1. 您可以根据需要添加任意数量的积分
  2. 它支持多态性
  3. 您不必为多个点创建变量&gt;更少的代码

答案 1 :(得分: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. 使用PicturePath类绘制直线,然后使用Canvas.drawPath()Canvas.drawPicture()。这一点,特别是对于大量的点,将真正加快绘图速度,因为所有绘图命令将在一次调用中传递给内部绘图函数。

  4. 根据需要简化形状。例如,您可以删除最长点(这是使用circular buffer的完美案例),使用Ramer-Douglas-Peucker algorithm这很容易实现,效果很好并且具有O(nlogn)的复杂性