我有一个自定义视图,我在其上绘制坐标的ArrayList (这是一个仅包含x和y位置的自定义类)。随着越来越多的坐标添加到ArrayList中,绘图速度会明显减慢。我想知道是否有一种更有效的方法来绘制这个ArrayList,或者,如果我可以只添加添加的一个坐标(因为ArrayList在调用无效时只更改一个坐标)。
以下是相关代码片段:
public class CustomDraw extends View {
// member variables
public void updateLine() {
// grab new coordinates for each measure
if(measure1.isEmpty()) {
measure1.add(new Coordinate(0, 0));
} else {
Coordinate last_coord = measure1.get(measure1.size() - 1);
// calculations for south, north, east, and west
if(south && east) {
measure1.add(new Coordinate(last_coord.x + 3, last_coord.y + 3));
} else if(south && west) {
measure1.add(new Coordinate(last_coord.x - 3, last_coord.y + 3));
} else if(north && east) {
measure1.add(new Coordinate(last_coord.x + 3, last_coord.y - 3));
} else if(north && west) {
measure1.add(new Coordinate(last_coord.x - 3, last_coord.y - 3));
}
}
if(draw) {
dh.sleep(10);
}
}
@Override
public void onDraw(Canvas c) {
super.onDraw(c);
Paint p = new Paint();
p.setStyle(Paint.Style.FILL);
p.setColor(Color.WHITE);
c.drawPaint(p);
p.setColor(Color.BLACK);
switch(mSelected) {
case Constants.MEASURE_1:
for(int i = 0; i < measure1.size(); i++) {
Coordinate coord = measure1.get(i);
Log.d("MAAV", "drawing coord.x, coord.y: " + (coord.x) + ", " + (coord.y));
c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
}
break;
}
}
class DrawHandler extends Handler {
@Override
public void handleMessage(Message msg) {
CustomDraw.this.updateLine();
CustomDraw.this.invalidate();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
}谢谢你的帮助!
发布于 2012-04-19 05:02:47
您将在循环的每个迭代中声明coord。您不需要这样做,并且为对象分配内存的成本可能很高。将其移出循环,简单地重用对象。也可以尝试注释掉日志调用,或者只记录每10个项目。
Coordinate coord;
for(int i = 0; i < measure1.size(); i++) {
coord = measure1.get(i)
if (i%10==0)
Log.d("MAAV", "drawing coord.x, coord.y: " + (coord.x) + ", " + (coord.y));
c.drawRect(coord.x, coord.y, coord.x + 3, coord.y + 3, p);
}如果这些更新不能充分提高性能,请考虑使用OpenGL ES进行绘图。
发布于 2012-04-19 05:13:33
除了slayton建议的改进之外,使用HashSet代替ArrayList也是可行的。这样你就不能添加重复的坐标。我不知道你是否在这样做,但如果你这样做了,这个改进将减少迭代。
如果您选择这样做,您将需要为您的坐标类实现一个equals方法,我相信您知道这一点。或者,如果您的坐标只包含x和y位置,那么您也可以使用java Point类。
发布于 2012-04-19 05:46:35
我的方法是在每个onDraw上的位图中绘制画布(或者使用ImageView的扩展并使用backgroundDrawable)。向类中添加一个字段以保存最新的新坐标,然后在后续的onDraws中,检索位图并仅添加新坐标。要重置,只需再次设置背景位图(或像现在一样使用View.setBackground )。我还没有测试过这一点,它可以使用一些增强,但希望它能给你一个想法,如果你一次只添加一个坐标,那么它将是超级有效的。
public class CustomDraw extends View {
public Bitmap backgroundBitmap;
public Coordinate newCoordinate;
...
...
@Override
public void onDraw(Canvas c) {
// no super.onDraw as we are drawing everything
Canvas backgroundCanvas = new Canvas(backgroundBitmap);
...
...
// draw new co-ordinate to the background bitmap
if (newCoordinate != null ){
drawCoordinate(backgroundCanvas, newCoordinate);
newCoordinate = null;
}
// draw the background bitmap to the view's canvas
c.drawBitmap(backgroundBitmap, null, null);
...
...
}https://stackoverflow.com/questions/10217877
复制相似问题