android canvas在翻译后使用屏幕原点而不是视图原点

时间:2013-04-03 09:15:53

标签: android android-canvas

我正在使用自定义视图和画布在屏幕上绘制对象。视图位于距屏幕原点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);


}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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的setter ......)

改为使用:

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

或简单地说:

canvas.Concat(myMatrix);