簡體   English   中英

Android使用Canvas優化線條畫

[英]Android-Optimize line drawing with 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線。

通過繪制直線並利用DashPathEffect將線條從背景色切換為可見色,可以達到相同的效果。

在此處輸入圖片說明

淡淡的線條不屬於的地方是該特定線段將被關閉的地方。 由於模式是可預測的,因此您的筆觸效果也是可以預測的。 因為您在注釋中說過,您還需要所有頂點的坐標,所以請運行一個單獨的循環,該循環從起點開始計算並從此處傳播頂點列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM