1

カスタム ビューとキャンバスを使用して画面上にオブジェクトを描画しています。ビューは、画面の原点からの Y オフセットにあります。キャンバスを翻訳してからオブジェクトを描画したい。ただし、setmatrix を使用してキャンバスを変換すると、原点がビューの原点から画面の原点に移動します。以下のコードに従って、ビューの原点に円を描画する必要があります。しかし、円を描くときに、画面の原点からのビューのオフセットを追加する必要があります。望ましい結果を得るにはどうすればよいですか?

protected void onDraw(Canvas canvas) 
{           
    super.onDraw(canvas);
    canvas.drawPaint(canvasPaint);
    m_canvasMatrix.set(getMatrix());
    m_canvasMatrix.postTranslate(-100, -100);
    canvas.setMatrix(m_canvasMatrix);
    canvas.drawCircle(100, 100, 20, circlePaint);


}
4

2 に答える 2

2

あなたの質問を完全に理解しているかどうかはわかりませんが、あなたがやろうとしていることは、単に相対的な翻訳を に適用することだと思いCanvasます. その場合、あなたは物事を一生懸命考えすぎています。あなたがする必要があるのは、次のとおりです。

protected void onDraw(Canvas canvas) 
{ 
    canvas.save();


    canvas.translate(100, 0);


    // At this point, drawing something (such as a square) with a top-left
    // corner at 0,0 would result in a square that's drawn with its top-left
    // 100px to the right of the left bound of the View.


    ...

    canvas.restore();
}
于 2013-04-03T09:28:57.457 に答える
1

問題は、(最初​​は私を含めて;-)キャンバスの初期行列が恒等行列であると直感的に期待していることです。実際、そうではありません。代わりに、画面からクライアント座標への必要な変換が含まれています。キャンバスのマトリックスを設定するだけで、この変換が効果的に消去されます。これが、円の原点がスクリーン (0,0) にある理由です。

これを回避するには、マトリックスを既存のキャンバスに連結するだけです。

protected void onDraw(Canvas canvas) 
{           
    super.onDraw(canvas);
    canvas.drawPaint(canvasPaint);
    m_canvasMatrix.set(getMatrix());
    m_canvasMatrix.postTranslate(-100, -100);
    canvas.concat(m_canvasMatrix); // <- !!!
    canvas.drawCircle(100, 100, 20, circlePaint);
}

そこにいるC#の人々への1つの発言:

canvas.Matrix.PreConcat(myMatrix) // <- !!! WRONG !!!

うまくいきません!(考えてみてください: Matrix のセッターは呼び出されません...)

代わりに次を使用します。

Matrix tmpMatrix = canvas.Matrix;
tmpMatrix.PreConcat(myMatrix);
canvas.Matrix = tmpMatrix;

または単に:

canvas.Concat(myMatrix);
于 2013-09-05T08:03:05.953 に答える