android - ArrayList的高效onDraw

标签 android arraylist android-canvas android-custom-view

我有一个自定义 View ,我在上面绘制了一个坐标数组列表(这是一个自定义类,只包含一个 x 和 y 位置)。随着越来越多的 Coordinates 添加到 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);
    }
}
}

感谢您的帮助!

最佳答案

您正在声明 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 进行绘图。

关于android - ArrayList的高效onDraw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217877/

相关文章:

java - 使用 HttpClient 时跨 Activity 使用 Cookie

java - 低帧率将位图写入 Canvas

android - 在填充的 android Canvas 上绘制一个透明圆圈

android - 当我尝试将图像上传到 firebase 存储 android 时调用 addOnFailureListener

android - mkdirs() 在写入外部权限时返回 false

Java ArrayList 比较 - TicTacToe

java - 可以访问 ArrayList 的排序父类(super class)

java - 如果对象存在于 arraylist 中则增加计数,否则将对象添加到 arraylist

android - 在 Android 4.0.3 的 Canvas 上绘制奇怪的崩溃。 A/libc : Fatal signal 11 (SIGSEGV)

Android SDK - camera2 - 在 TextureView 上绘制矩形