我找到了这个小样本代码,用手指画画:
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,并且它越接近全彩,绘制的速度就越慢,然后圆圈变得间隔开。
答案 0 :(得分:1)
不,这在这个例子中是有意义的。
他遍历他想要绘制的所有点。 这意味着他将每个点添加到数组中,因此他可以一次遍历所有对象。
你会经常在游戏编程中看到这一点。
这也非常容易扩展。
答案 1 :(得分:1)
首先,使用描边(不是圆圈)绘制线条。第二,近似。以下是摘要:
Paint
以使用width=5
的笔画。这减少了画这么多圈子的需要。选择一个阈值,例如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
这应该减少(不明显)点数。
使用Picture
或Path
类绘制直线,然后使用Canvas.drawPath()
或Canvas.drawPicture()
。这一点,特别是对于大量的点,将真正加快绘图速度,因为所有绘图命令将在一次调用中传递给内部绘图函数。
根据需要简化形状。例如,您可以删除最长点(这是使用circular buffer的完美案例),使用Ramer-Douglas-Peucker algorithm这很容易实现,效果很好并且具有O(nlogn)
的复杂性