Android-Optimize使用Canvas进行线条绘制

时间:2014-06-22 08:49:15

标签: java android android-canvas

我在整个手机的屏幕上画了一个六边形网格。我正在使用Canvas绘制六条线来绘制六边形。正在绘制太多行,这使得应用程序无响应。我不得不做android:HardwareAccelerated=false至少使其在我的Nexus 4上工作,否则应用程序会因此错误而崩溃:

06-22 14:11:46.664: A/libc(5743): Fatal signal 6 (SIGABRT) at 0x0000166f (code=-6), thread 5743 (.nadeem.sensus4)

虽然应用程序现在没有崩溃,但绘制网格需要花费太多时间。这是我的CustomView的代码,用于绘制网格:

public DrawView(Context context, Hexagon hex) {
    super(context);
    this.context = context;
    setLayerType(View.LAYER_TYPE_HARDWARE, null);
     this.hex = hex;

}

@Override
public void onDraw(Canvas canvas) {

    double xOff = Math.cos(Math.PI / 6) * hex.radius;//radius is 12 for now
    double yOff = Math.sin(Math.PI / 6) * hex.radius; // third of the hex
                                                        // height

    for (int i = 0; i < 60; ++i) {
        for (int j = 0; j < 40; ++j) {
            double xPos = j * xOff * 2;

            if (i % 2 != 0) { // if the current line is not even
                xPos += xOff; // extra offset of half the width on x axis
            }


            double yPos = i * yOff * 3;
            createHexagon(xPos, // X pos for hexagon center on the scene
                    yPos, canvas);
        }

    }

}

public void createHexagon(double x, double y, Canvas canvas) {

    paint.setColor(Color.BLACK);
    paint.setStyle(Style.STROKE);

    // paint.setStyle(Style.FILL);
    for (int i = 0; i < 6; i++) {
        double angle = 2 * Math.PI / 6 * (i + 0.5);


        double x_i = x + hex.radius * Math.cos(angle);
        double y_i = y + hex.radius * Math.sin(angle);
        if (i == 0)
            wallpath.moveTo((float) x_i, (float) y_i);
        else
            wallpath.lineTo((float) x_i, (float) y_i);
    }
    canvas.drawPath(wallpath, paint);
    canvas = null;
}

我想问一下是否有办法提高性能或任何其他方式来实现这个网格。

2 个答案:

答案 0 :(得分:1)

分层绘图。第一次绘制时,将所有六边形绘制到单个位图。然后在以后的所有绘图中,只需将该位图绘制到屏幕上即可。然后添加您需要绘制的任何其他内容。它将为您节省14000个绘制线命令。

您的另一个好选择是转移到openGL进行绘图。但是如果没有任何真正的速度硬件加速,你就无法获得14K线路。

答案 1 :(得分:0)

您可以通过绘制直线并使用DashPathEffect将一条线从背景颜色切换为可见颜色来实现相同的效果。

enter image description here

微弱线条不属于哪个特定线段将被关闭的位置。由于模式是可预测的,因此您的笔触效果也是如此。因为您在评论中说您还需要所有顶点的坐标,所以运行一个单独的循环,从起点开始计算并从那里传播顶点列表。