java - Android-利用Canvas优化画线

标签 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;
}

我想问是否有办法提高性能或任何其他替代方法来实现此网格。

最佳答案

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

另一个不错的选择是转向 openGL 进行绘图。但如果没有任何实际速度的硬件加速,您就不可能绘制 14K 条线。

关于java - Android-利用Canvas优化画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349633/

相关文章:

java - 如何访问对象中的对象?

JavaFX HTMLEditor 超链接

Android EditText真实内容高度

android - 如何像在 Android 上的 Gmail 应用程序中那样创建多个 Actionbar

java - WaitForGcToComplete 因 DisableMovingGc 而阻塞 89.851 毫秒

java - 除数范围 (Java)

JAVA错误: "E/MediaPlayer: Error (-38,0)"

不同 API 上的 Android 绘画问题

java - 我的绘图线程突然停止的原因是什么?

android - Canvas clipPath 仅适用于 Android 模拟器