3

本当に解決できない問題があります。多くのデータポイントを持つデータを含むグラフアプリを作成しました。グラフのスクロールを有効にするには、グラフ データのビットマップを作成し、ユーザー入力に応じてビットマップを画面の右または左にシフト/移動します。ビットマップは常にグラフ ビューの高さとグラフ ビューの幅です。ユーザーがビットマップを移動すると、ビットマップを次のようにシフトします。

memoryCanvas.drawBitmap(memoryBitmap, bitmapShift, 0.0f, ペイント);

ここで、shift はシフト値を含む float 値です。

今、私が試したほとんどのデバイスで、これは非常にうまく機能します。HTC Desire、Galaxy Tab、Galaxy S で試しましたが、自分の Galaxy S でテストすると、説明できない奇妙な結果が得られました。私のGalaxy SにはカスタムROM(Android 4.0.4を使用)が含まれていることに注意してください。これがおそらくこの動作が発生する理由ですが、それでも理解できないか、適切に軽減できません。

したがって、通常のユースケースの動作では、ビットマップは bitmapShift ピクセル数だけシフトされ、通常の線画で空のスペースを埋めます。しかし、携帯電話を使用してビットマップをゆっくりとドラッグすると、bitmapShift の値は約 0.5 になり、ビットマップは動かないか、時々しか動かなくなります。他のプラットフォームで bitmapShift を比較したところ、ゆっくりドラッグすると同じ範囲の 0.5 になりました。もちろん、この振る舞いは私の絵を台無しにします。これは、ドラッグを高速で行った場合にも発生しますが、ゆっくりドラッグした場合に最も顕著になります。

この動作の原因は何なのか、私にはよくわかりません。bitmapShift 値に従ってビットマップが移動しません。私が試した他のすべてのプラットフォームで動作します。ビットマップの使用をスキップし、シフト値に従って線のみを描画すると、すべて正常に機能します。

この動作の原因について何か考えがある人はいますか? それを理解しようとして数日座った後、私はちょっと不足しています。重要なコードは次のとおりです。このコードは私の onDraw 関数にあります。

memoryCanvas.setBitmap(emptyBitmap); //First set another bitmap to clear 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear it
memoryCanvas.drawBitmap(memoryBitmap, bitmapShift, 0.0f, paint); //Draw shifted bitmap on it
memoryCanvas.drawLines(lineDrawPoints, 0 , cnt, paint); //Draw remaining lines
memoryCanvas.setBitmap(memoryBitmap); //Set the original 
memoryCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //Clear original
memoryCanvas.drawBitmap(emptyBitmap, 0.0f, 0.0f, paint); //Draw the final image                 
canvas.drawBitmap(memoryBitmap, 0, 0.0f, paint); //And finally draw on real canvas

ヘルプ、ヒント、提案は大歓迎です。

乾杯ヴィルヘルム

4

1 に答える 1

1

Canvas に単純な変換セット (単純な変換 = 移動のみ、回転なし、スケールなし) しかない場合、Android の 2D レンダリング ライブラリである Skia はビットマップをピクセル グリッドに揃えます。これは、1 ピクセル未満の移動がまったく表示されない可能性があることを意味します。ばかげた回避策は、ビットマップを描画する前に、Canvas で非常に小さなスケールまたは回転変換を設定することです。これには、ビットマップがピクセル グリッドにスナップされないという副作用があります。

Paint に新しい API を追加して、どのような変換が設定されていても、アプリがビットマップのサブピクセル位置を指定できるようにする必要があると思います。

于 2012-11-21T16:01:44.840 に答える