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# 人的一句话:

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 回答