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