我在整个手机的屏幕上画了一个六边形网格。我正在使用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;
}
我想问一下是否有办法提高性能或任何其他方式来实现这个网格。
答案 0 :(得分:1)
分层绘图。第一次绘制时,将所有六边形绘制到单个位图。然后在以后的所有绘图中,只需将该位图绘制到屏幕上即可。然后添加您需要绘制的任何其他内容。它将为您节省14000个绘制线命令。
您的另一个好选择是转移到openGL进行绘图。但是如果没有任何真正的速度硬件加速,你就无法获得14K线路。
答案 1 :(得分:0)
您可以通过绘制直线并使用DashPathEffect将一条线从背景颜色切换为可见颜色来实现相同的效果。
微弱线条不属于哪个特定线段将被关闭的位置。由于模式是可预测的,因此您的笔触效果也是如此。因为您在评论中说您还需要所有顶点的坐标,所以运行一个单独的循环,从起点开始计算并从那里传播顶点列表。