gpt4 book ai didi

java - Android-利用Canvas优化画线

转载 作者:行者123 更新时间:2023-12-01 12:49:27 26 4
gpt4 key购买 nike

我正在整个手机屏幕上绘制六边形网格。我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com