7

シグナルを表示するカスタム ビューを作成しています。onDraw() の時間を短縮するために、これまでに描画したすべてをビットマップにキャッシュし、すべての onDraw() 呼び出しでそれに追加するだけです。これを行うことで、すべてをやり直すのではなく、一度にいくつかのフィクセルを描画するだけでよいため、時間を大幅に節約できます。

ただし、気になる点があります-提供されたキャンバスに直接描画すると、最初にビットマップに描画してからキャンバスにビットマップを描画するよりも「正確な」描画が提供されるようです。次の写真の下部を見ると、違いがわかります。

信号の下部を見て違いを確認してください - 同じ drawLine 呼び出しがあります

https://github.com/gardah/android-uglybitmapdrawing/で不一致を表示するデモ プロジェクトをアップロードしましたが、関連するコードは次のとおりです。

@Override
public void onDraw(Canvas canvas) {
    if(cachedBitmap == null) {
        cachedBitmap = Bitmap.createBitmap(getWidth(), 200, Config.ARGB_8888);
        cachedCanvas = new Canvas(cachedBitmap);
    }

    for(int i = 0; i < COORDS.length; i++) {
        float[] curCoords = COORDS[i];
        canvas.drawLine(curCoords[0], curCoords[1], curCoords[2], curCoords[3], linePaint);
        cachedCanvas.drawLine(curCoords[0], curCoords[1], curCoords[2], curCoords[3], linePaint);
    }
    canvas.drawBitmap(cachedBitmap, 0, 120, null);
}

2 つのトレースが同じではないのはなぜですか? さらに重要なことに、下のトレースを上のトレースのように見せるにはどうすればよいですか?

4

3 に答える 3

3

違いの理由は、キャンバスの描画はハードウェア アクセラレーション (GPU) によって行われ、ビットマップの描画はソフトウェア (CPU) によって行われるためです。ハードウェア アクセラレーションを無効にすると、まったく同じになります。X 座標を 10 倍すると、違いは線の結合方法にあることがわかります。これらはわずか 1 ピクセルの違いであり、気にする必要はありません。どちらがより正確かはわかりませんが、実装がわずかに異なるようです。

于 2013-06-10T14:25:53.737 に答える
0

ビットマップ ルートを使用することで大幅に節約できるという意見には同意しません。描画された信号を格納し、これをシリアル化/逆シリアル化できる JSON オブジェクトに変換するデータ構造を検討することができます。あなたの質問に関しては、これは経験に基づいた推測ですが、ビットマップを作成するときに getHeight() を使用していないため、描画された信号の再スケーリングに関係しています。

于 2013-06-10T14:07:58.857 に答える